home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
CRS
/
crs49.d81
/
hack10b.sfx
/
issue10b
Wrap
Text File
|
1990-02-12
|
81KB
|
1,995 lines
╔N THE CODE, THERE ARE SOME COMMENTS THAT DOCUMENT THE VIDEO TIMING,
LIKE THIS ONE:
;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
;SSSSSSSSSS ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
;==========XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX▄▄╪╪╪====== ╨HI-2 6510
; ^ NOW WE ARE HERE
╘HE TWO VERTICAL BARS "▄" DENOTE OPTIONAL CYCLES. ╧N ╨┴╠-┬ SYSTEMS
(63 CYCLES PER LINE), THEY ARE NOT PRESENT. ╧N 6567╥56┴, WHICH HAS 64
CYCLES PER LINE, THERE IS ONE ADDITIONAL CYCLE ON THIS POSITION, AND
THE 6567╥8 HAS TWO ADDITIONAL CYCLES THERE.
╘HE NUMBERS 0 THROUGH 7 ARE SPRITE POINTER FETCHES (FROM THE END OF
THE CHARACTER MATRIX, E.G. THE TEXT SCREEN), THE "S" CHARACTERS DENOTE
SPRITE IMAGE FETCHES, THE "R"S ARE MEMORY REFRESH, AND THE "G" ARE
GRAPHICS FETCHES. ╘HE TWO IDLE VIDEO CHIP CYCLES ARE MARKED WITH "-".
╧N THE PROCESSOR TIMING LINE, THE "=" SIGNS SHOW HALTED ├╨╒, "X" MEANS
FREE BUS, AND "╪" MEANS THAT THE PROCESSOR WILL BE HALTED AT ONCE,
UNLESS IT IS PERFORMING WRITE CYCLES.
PROCESSOR 6502
; ╙ELECT THE VIDEO TIMING (PROCESSOR CLOCK CYCLES PER RASTER LINE)
├┘├╠┼╙ = 65 ; 6567╥8 AND ABOVE, ╬╘╙├-═
;├┘├╠┼╙ = 64 ; 6567╥5 6┴, ╬╘╙├-═
;├┘├╠┼╙ = 63 ; 6569 (ALL REVISIONS), ╨┴╠-┬
CINV = $314
CNMI = $318
RASTER = 52 ; START OF RASTER INTERRUPT
M = $FB ; ZERO PAGE VARIABLE
.ORG $801
BASIC:
.WORD 0$ ; LINK TO NEXT LINE
.WORD 1995 ; LINE NUMBER
.BYTE $9┼ ; ╙┘╙ TOKEN
; ╙┘╙ DIGITS
.IF (* + 8) / 10000
.BYTE $30 + (* + 8) / 10000
.ENDIF
.IF (* + 7) / 1000
.BYTE $30 + (* + 7) % 10000 / 1000
.ENDIF
.IF (* + 6) / 100
.BYTE $30 + (* + 6) % 1000 / 100
.ENDIF
.IF (* + 5) / 10
.BYTE $30 + (* + 5) % 100 / 10
.ENDIF
.BYTE $30 + (* + 4) % 10
0$:
.BYTE 0,0,0 ; END OF ┬┴╙╔├ PROGRAM
START:
JMP INSTALL
JMP DEINSTALL
INSTALL: ; INSTALL THE RASTER ROUTINE
JSR RESTORE ; ─ISABLE THE ╥ESTORE KEY (DISABLE ╬═╔ INTERRUPTS)
CHECKIRQ:
LDA CINV ; CHECK THE ORIGINAL ╔╥╤ VECTOR
LDX CINV+1 ; (TO AVOID MULTIPLE INSTALLATION)
CMP #<IRQ1
BNE IRQINIT
CPX #>IRQ1
BEQ SKIPINIT
IRQINIT:
SEI
STA OLDIRQ ; STORE THE OLD ╔╥╤ VECTOR
STX OLDIRQ+1
LDA #<IRQ1
LDX #>IRQ1
STA CINV ; SET THE NEW INTERRUPT VECTOR
STX CINV+1
SKIPINIT:
LDA #$1B
STA $D011 ; SET THE RASTER INTERRUPT LOCATION
LDA #RASTER
STA $D012
LDX #$E
CLC
ADC #3
TAY
LDA #0
STA M
0$:
LDA M
STA $D000,X ; SET THE SPRITE ╪
ADC #24
STA M
TYA
STA $D001,X ; AND ┘ COORDINATES
DEX
DEX
BPL 0$
LDA #$7F
STA $DC0D ; DISABLE TIMER INTERRUPTS
STA $DD0D
LDX #1
STX $D01A ; ENABLE RASTER INTERRUPT
LDA $DC0D ; ACKNOWLEDGE ├╔┴ INTERRUPTS
LSR $D019 ; AND VIDEO INTERRUPTS
LDY #$FF
STY $D015 ; TURN ON ALL SPRITES
CLI
RTS
DEINSTALL:
SEI ; DISABLE INTERRUPTS
LDA #$1B
STA $D011 ; RESTORE TEXT SCREEN MODE
LDA #$81
STA $DC0D ; ENABLE ╘IMER ┴ INTERRUPTS ON ├╔┴ 1
LDA #0
STA $D01A ; DISABLE VIDEO INTERRUPTS
LDA OLDIRQ
STA CINV ; RESTORE OLD ╔╥╤ VECTOR
LDA OLDIRQ+1
STA CINV+1
BIT $DD0D ; RE-ENABLE ╬═╔ INTERRUPTS
CLI
RTS
; ┴UXILIARY RASTER INTERRUPT (FOR SYNCRONIZATION)
IRQ1:
; IRQ (EVENT) ; > 7 + AT LEAST 2 CYCLES OF LAST INSTRUCTION (9 TO 16 TOTAL)
; PHA ; 3
; TXA ; 2
; PHA ; 3
; TYA ; 2
; PHA ; 3
; TSX ; 2
; LDA $0104,X ; 4
; AND #XX ; 2
; BEQ ; 3
; JMP ($314) ; 5
; ---
; 38 TO 45 CYCLES DELAY AT THIS STAGE
LDA #<IRQ2
STA CINV
LDA #>IRQ2
STA CINV+1
NOP ; WASTE AT LEAST 12 CYCLES
NOP ; (UP TO 64 CYCLES DELAY ALLOWED HERE)
NOP
NOP
NOP
NOP
INC $D012 ; ┴T THIS STAGE, $D012 HAS ALREADY BEEN INCREMENTED BY ONE.
LDA #1
STA $D019 ; ACKNOWLEDGE THE FIRST RASTER INTERRUPT
CLI ; ENABLE INTERRUPTS (THE SECOND INTERRUPT CAN NOW OCCUR)
LDY #9
DEY
BNE *-1 ; DELAY
NOP ; ╘HE SECOND INTERRUPT WILL OCCUR WHILE EXECUTING THESE
NOP ; TWO-CYCLE INSTRUCTIONS.
NOP
NOP
NOP
OLDIRQ = * + 1 ; ╨LACEHOLDER FOR SELF-MODIFYING CODE
JMP * ; ╥ETURN TO THE ORIGINAL INTERRUPT
; ═AIN RASTER INTERRUPT
IRQ2:
; IRQ (EVENT) ; 7 + 2 OR 3 CYCLES OF LAST INSTRUCTION (9 OR 10 TOTAL)
; PHA ; 3
; TXA ; 2
; PHA ; 3
; TYA ; 2
; PHA ; 3
; TSX ; 2
; LDA $0104,X ; 4
; AND #XX ; 2
; BEQ ; 3
; JMP (CINV) ; 5
; ---
; 38 OR 39 CYCLES DELAY AT THIS STAGE
LDA #<IRQ1
STA CINV
LDA #>IRQ1
STA CINV+1
LDX $D012
NOP
#IF ├┘├╠┼╙ - 63
#IF ├┘├╠┼╙ - 64
NOP ; 6567╥8, 65 CYCLES/LINE
BIT $24
#ELSE
NOP ; 6567╥56┴, 64 CYCLES/LINE
NOP
#ENDIF
#ELSE
BIT $24 ; 6569, 63 CYCLES/LINE
#ENDIF
CPX $D012 ; ╘HE COMPARISON CYCLE IS EXECUTED ├┘├╠┼╙ OR ├┘├╠┼╙+1 CYCLES
; AFTER THE INTERRUPT HAS OCCURRED.
BEQ *+2 ; ─ELAY BY ONE CYCLE IF $D012 HADN'T CHANGED.
; ╬OW EXACTLY ├┘├╠┼╙+3 CYCLES HAVE PASSED SINCE THE INTERRUPT.
DEX
DEX
STX $D012 ; RESTORE ORIGINAL RASTER INTERRUPT POSITION
LDX #1
STX $D019 ; ACKNOWLEDGE THE RASTER INTERRUPT
LDX #2
DEX
BNE *-1
NOP
NOP
LDA #20 ; SET THE AMOUNT OF RASTER LINES-1 FOR THE LOOP
STA M
LDX #$C8
IRQLOOP:
LDY #2
DEY
BNE *-1 ; DELAY
DEC $D016 ; NARROW THE SCREEN (EXACT TIMING REQUIRED)
;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
;SSSSSSSSSS ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
;==========XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX▄▄╪╪╪====== ╨HI-2 6510
; ^ NOW WE ARE HERE
STX $D016 ; EXPAND THE SCREEN
#IF ├┘├╠┼╙ - 63
#IF ├┘├╠┼╙ - 64
BIT $24 ; 6567╥8
#ELSE
NOP ; 6567╥56┴
#ENDIF
#ELSE
NOP ; 6569
#ENDIF
DEC M
BMI ENDIRQ
CLC
LDA $D011
SBC $D012
AND #7
BNE IRQLOOP ; ╘HIS INSTRUCTION TAKES 4 CYCLES INSTEAD OF 3,
; BECAUSE THE PAGE BOUNDARY IS CROSSED.
BADLINE:
DEC M
NOP
NOP
NOP
NOP
DEC $D016
;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
;SSSSSSSSSS CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
;==========X╪╪╪========================================▄▄***====== ╨HI-2 6510
; ^ WE ARE HERE
STX $D016
;3S4S5S6S7SRRRRRGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG--▄▄0S1S2S ╨HI-1 ╓╔├-╔╔
;SSSSSSSSSS ▄▄SSSSSS ╨HI-2 ╓╔├-╔╔
;==========XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX▄▄╪╪╪====== ╨HI-2 6510
; ^ ^^- WE ARE HERE (6569)
; ▄ \- OR HERE (6567╥56┴)
; \- OR HERE (6567╥8)
LDY #2
DEY
BNE *-1
NOP
NOP
#IF ├┘├╠┼╙ - 63
#IF ├┘├╠┼╙ - 64
NOP ; 6567╥8, 65 CYCLES/LINE
NOP
NOP
#ELSE
BIT $24 ; 6567╥56┴, 64 CYCLES/LINE
#ENDIF
#ELSE
NOP ; 6569, 63 CYCLES/LINE
#ENDIF
DEC M
BPL IRQLOOP ; ╘HIS IS A 4-CYCLE BRANCH (PAGE BOUNDARY CROSSED)
ENDIRQ:
JMP $EA81 ; RETURN TO THE AUXILIARY RASTER INTERRUPT
RESTORE: ; DISABLE THE ╥ESTORE KEY
LDA CNMI
LDY CNMI+1
PHA
LDA #<NMI ; ╙ET THE ╬═╔ VECTOR
STA CNMI
LDA #>NMI
STA CNMI+1
LDX #$81
STX $DD0D ; ┼NABLE ├╔┴ 2 ╘IMER ┴ INTERRUPT
LDX #0
STX $DD05
INX
STX $DD04 ; ╨REPARE ╘IMER ┴ TO COUNT FROM 1 TO 0.
LDX #$DD
STX $DD0E ; ├AUSE AN INTERRUPT.
NMI = * + 1
LDA #$40 ; ╥╘╔ PLACEHOLDER
PLA
STA CNMI
STY CNMI+1 ; RESTORE ORIGINAL ╬═╔ VECTOR (ALTHOUGH IT WON'T BE USED)
RTS
┬INARIES
╚ERE ARE THE PROGRAMS IN UUENCODED FORMAT. ╞IRST THE ╓╔├-20 PROGRAMS:
├OLOR BOXES FOR THE ╓╔├-20, ╬╘╙├-═ VERSION (PROBABLY DISTORTED DISPLAY):
BEGIN 644 COPPER.6560
═└1└*$,╠'╟├0╤,#─└└└"╔?╪╘╬─8╘═─8╘>─:(<[└20╘/╬@"20─╦@20┬┬0─)"2┬
═%<╦0_<╘$─+└└┬-#╦╩4"-&┘&-*┘&╔0┌)"├1:1├2:1╚└:(╘/╘─)(╪┼─:└*┬-#]
═├┴61╩6╥-%└.╔$(╘5└┌╟└├2┌18*╘4─<─(─└1(:"─'╥020!"0─*0/)└╦└└╠└!*
═╠└"@$*╘/─*╔)]╪╘/─(╪/─(╘/─(╪/─(╘/─(╪/─(╘/─(╪/─(╘/─(╪/─(╘/─(╪/
,─$┴╚)"3╩┬-#43+_╩
└
END
├OLOR BOXES FOR THE ╓╔├-20, ╨┴╠-┬ VERSION:
BEGIN 644 COPPER.6561
═└1└*$,╠'╟├0╤,#─└└└"╔?╪╘╬─8╘═─8╘>─:(<[└20╘/╬@"20─╦@20┬┬0─╚┴├*
═╘/╫-!)"╨└(├0[:┼└├1╬1├2╬1╩8:┬5╚╘6─8╘╞─:└'┬-#]┌╬╩.)9&@"╚├0_8╪5
═─:┼╩├10#╩1"-%0.╔╨(╘╬─6"═%)')")└$2&@╔!\─$─└0─)"─#╥0*╨└+└└2╦└└
═╚!"═#┘"╩2?>-#┘".#┘"-#┘".#┘"-#┘".#┘"-#┘".#┘"-#┘".#┘"-#┘".#┘!(
+:$┴╚┌╬╩(╘--,╧^╩.
└
END
╥EMOVED SIDEBORDERS WITH 8 SPRITES AND BAD LINES, ╨┴╠-┬ VERSION:
BEGIN 644 RASTER.63
═└0@*",╠'╟├(╨-├$└└└!,$╨┴,=└@@'0╞═%└.╬%0/)┼=└$╪└├╨$7┬-╬0┬.╬@┬╔
═┼:((├10#├┴4#╩1╬-$="╔-(╘2╘*(.&&─#╩*─└┴?╬┼^┘╘└╘&─8┴?╬8╟0'0╥╠╚0
═[┌┼_├0╫<├0╫=╚@&.&═"═#=╤.&="@_╪╨5╘%┴@>*─;├1'0╩8&-#=╥╔└(╘:╘*╓┘
═"(╘4└┌╓┌"(╘5└╥╨-╫5┴@╩;╬-%└.╔"(╘5└^╦╩┌╬╦╩┌╬╪2╘*─!├1╟06*└)┬-#]
═┌╬╦╩┌╬╔,╬└┬╔┼8╘4└┌─(├14#╦┴+0┌┬0─[!+0\└#*╥╚╪2╘*(!├┴╟0╚@+*╘/╫╩
═┌╩─4┴?╬┬╥*└"┬-#]╙┴;0├┴;0┌╠;[,",8╦1'0[1+0*0?0┘<;[┌╬╦╩┌╠╪6╘(╪6
═╘*└"┬-#]┌╬╦╩╤╧╠0╙4╥!┌╩╘8└┌╨9└╘┬╔0╚╘8└┌─)├1─#╚╚&.#=╓┬└(╪%╫>┬.
1!-╓┬╫8╪.╫:┼└:(╘8└╪╨9└╓└8
└
END
╥EMOVED SIDEBORDERS WITH 8 SPRITES AND BAD LINES, 6567╥56┴ VERSION
(VERY OLD ╬╘╙├-═ ├64S):
BEGIN 644 RASTER.64
═└0@*",╠'╟├(╨-├$└└└!,$╨┴,=└@@'@╞═%└.╬%0/)┼=└$╪└├╨$7┬-╬0┬.╬@┬╔
═┼:((├10#├┴4#╩1╬-$="╔-(╘2╘*(.&&─#╩*─└┴?╬┼^┘╘└╘&─8┴?╬8╟0'0╥╠╚0
═[┌┼_├0╫<├0╫=╚@&.&═"═#=╤.&="@_╪╨5╘%┴@>*─;├1'0╩8&-#=╥╔└(╘:╘*╓┘
═"(╘4└┌╓┌"(╘5└╥╨-╫5┴@╩;╬-%└.╔"(╘5└^╦╩┌╬╦╩┌╬╪2╘*─!├1╟06*└)┬-#]
═┌╬╦╩┌╬╔,╬└┬╔┼8╘4└┌─(├14#╦┴+0┌╬╦╩[!+0\└#*╥╚╪2╘*(!├┴╟0╚@+*╘/╫╩
═┌╩─4┴?╬┬╥*└"┬-#]╙┴;0├┴;0┌╠;[,"08╦1'0[1+0*0?0┘<;[┌╬╦╩┌╠╪6╘(╪6
═╘*└"┬-#]┌╬╚─),;[$,╤,@>╩═&└.╠&0-(╩4.-&└.╔"8╘9└┌*!├@╫=╚@".!=╫╚
2├@3=╚═╓.#═╓╔0&┬-&└.,&0-@
└
END
╥EMOVED SIDEBORDERS WITH 8 SPRITES AND BAD LINES, 6567╥8 AND ABOVE
(NOT TOO OLD ╬╘╙├-═ ├64S AND ALL ├128S)
BEGIN 644 RASTER.65
═└0@*",╠'╟├(╨-├$└└└!,$╨┴,=└@@(0╞═%└.╬%0/)┼=└$╪└├╨$7┬-╬0┬.╬@┬╔
═┼:((├10#├┴4#╩1╬-$="╔-(╘2╘*(.&&─#╩*─└┴?╬┼^┘╘└╘&─8┴?╬8╟0'0╥╠╚0
═[┌┼_├0╫<├0╫=╚@&.&═"═#=╤.&="@_╪╨5╘%┴@>*─;├1'0╩8&-#=╥╔└(╘:╘*╓┘
═"(╘4└┌╓┌"(╘5└╥╨-╫5┴@╩;╬-%└.╔"(╘5└^╦╩┌╬╦╩┌╬╪2╘*─!├1╟06*└)┬-#]
═┌╬╦╩┌╬╔,╬└┬╔┼8╘4└┌─(├14#╦┴+0┌╬╚─).╨2╘/└└╥╠╩.$═"┬└8╪9╘*("╥═#]
═┌╬╩╔%(7[╚╠┬@└╚├0_<╪6╘(╪6╘"0─╤╧╠╨)1┬═$=#═$═└╔!]#─╤╧╧╩┌╬╦╩╙┴;0
═├┴;0╚└*(╘/╫╩┌╬╦╩┌╠;[$,╔,@>╩═&└.╠&0-(╩4:-&└.╔"8╘9└┌*!├@╫=╚@".
5!=╫╚├@3=╚═╓.#═╓╔0&┬-&└.,&0-@
└
END
╘HAT WAS ALL, FOLKS! ╔ HOPE YOU LEARNED SOMETHING FROM THIS ARTICLE.
╞EEL FREE TO E-MAIL ME AT ═ARKO.═AKELA@╚╒╘.╞╔, SHOULD ANYTHING REMAIN
UNCLEAR.
========================================================================
┴ ─IFFERENT ╨ERSPECTIVE, PART ╔╔╔
BY ╙TEPHEN ╩UDD --- SJUDD@NWU.EDU
╟EORGE ╘AYLOR --- AA601@CFN.CS.DAL.CA
╫HEW! ╫HAT A BUSY TIME IT'S BEEN -- RESEARCH TO GET DONE,
CONFERENCES, CLASSES... BETWEEN GETTING THINGS DONE AND BLOWING OTHER
THINGS OFF, ╔ ONE DAY REFLECTED FOR A MOMENT AND REALIZED THAT ╔ HAD
THREE DAYS LEFT TO GET THE NEXT ARTICLE TOGETHER FOR ├=╚ACKING! ╙O
EVERYTHING HAS BEEN SLAPPED TOGETHER AT THE LAST MINUTE, AND ╔ HOPE
YOU'LL FORGIVE ANY BUGS OR UNCLEAR CONCEPTS.
>>> ┴╬┼├─╧╘┼ ┴╠┼╥╘ <<<
┴ND THAT REMINDS ME: ╔ JUST GOT ╩IFFY─╧╙ AND AN ╞─-2000 DRIVE --
WHAT A WONDERFUL DEVICE. ╔ HAVE A 1.6 MEGABYTE DISK FORMATTED INTO
THREE PARTITIONS. ╘HE FIRST CONTAINS MY ═ERLIN 128 ASSEMBLER, THE
SECOND IS SOME 4000 BLOCKS LARGE AND ╔ USE IT FOR ALL MY VARIOUS
VERSIONS OF CODE WHILE DEBUGGING, AND THE THIRD IS MAYBE 1000 BLOCKS,
AND CONTAINS ONLY FINISHED CODE -- NO MORE SWAPPING DISKS, NO MORE
DELETING OLD VERSIONS THAT ╔ HOPE ╔ DON'T NEED TO MAKE ROOM ON THE
DISK. ┴LSO, WHEN ╔ INSTALLED ╩IFFY─╧╙ ╔ FOUND A SERIOUS BUG IN MY
128─ -- A CRICKET, DEAD AMONG THE ╔├'S.
╘HIS TIME WE WILL COVER A LOT OF GROUND WHICH ISN'T SO MUCH
CUTTING-EDGE AS IT IS VERY USEFUL. ╠ET'S FACE IT: CUBES ARE GETTING
MORE THAN A LITTLE DULL. ┴ WORTHY END GOAL IS TO HAVE A COMPLETELY
GENERAL ROUTINE FOR PLOTTING A SERIES OF POLYGONS -- THAT IS, YOU SUPPLY
A LIST OF (X,Y,Z) COORDINATES FROM WHICH THE PROGRAM CAN FORM A LIST OF
POLYGONS. ╘HESE POLYGONS MAY THEN BE DISPLAYED IN 2─, ROTATED, MAGNIFIED,
FILLED, ETC. ┴ND, MUCH TO MY THREE-DAY ASTONISHMENT, THAT IS EXACTLY
WHAT WE ARE GOING TO DO.
┬UT FIRST, A LITTLE EXCURSION. ╧NE THING WE ARE OF COURSE ALWAYS
THINKING ABOUT IS OPTIMIZATION POSSIBILITIES: IN THE SHOWER, WHILE
SLEEPING/DREAMING, OUT ON DATES, ETC. ╙O, WHERE TO BEGIN? ╘HE BIGGEST
CYCLE HOGS IN THE PROGRAM ARE LINE DRAWING AND FACE FILLING -- WELL,
FILLING FACES IS PRETTY STRAIGHTFORWARD. ╫HAT ABOUT LINE DRAWING?
╫ELL, ONE DOWNER OF THE ROUTINE IS THAT EVERY SINGLE PIXEL IS
PLOTTED. ┬UT AS WE KNOW, ON A COMPUTER ANY GIVEN LINE IS MADE UP OF
SEVERAL SMALLER VERTICAL AND HORIZONTAL LINES -- WOULDN'T IT BE NEAT
IF WE COULD THINK OF A WAY TO PLOT THESE LINE CHUNKS ALL AT ONCE,
INSTEAD OF A PIXEL AT A TIME?
╚ECK YES IT WOULD! ╙O HERE WE GO:
╬EAT-O ┼NHANCED ├HUNKY ╠INE ─RAWING ╥OUTINE
-------------------------------------------
╞IRST WE NEED TO BE IN THE RIGHT MINDFRAME. ╠ET'S SAY YOU'RE
DRAWING A LINE WHERE YOU MOVE THREE PIXELS IN X BEFORE IT'S TIME TO TAKE
A STEP IN Y. ╔NSTEAD OF PLOTTING ALL THREE PIXELS IT WOULD OF COURSE
BE MUCH MORE EFFICIENT TO JUST STICK A NUMBER LIKE %00011100 IN THE
DRAWING BUFFER. ┬UT SOMEHOW WE NEED TO KEEP TRACK OF A) HOW LARGE THE
CHUNK NEEDS TO BE, AND B) WHERE EXACTLY THE CHUNK IS.
╔N THE ABOVE EXAMPLE, WE STARTED AT A PARTICULAR X-VALUE:
%00010000
AND WE WANT TO KEEP ADDING ONES TO THE RIGHT OF THE STARTING POINT; THREE,
TO BE EXACT. ╚MMM... WE NEED TO SOMEHOW ROTATE THE STARTING BIT IN A WAY
THAT LEAVES A TRAIL OF ONES BEHIND IT. ═AYBE ROTATE AND ╧╥┴ WITH THE
ORIGINAL BIT? ┬UT WHAT HAPPENS WHEN YOU TAKE A STEP IN ┘?
╬O, WE NEED SOMETHING FAR SNEAKIER. ╠ET'S SAY THAT INSTEAD OF
%00010000 WE START WITH
X = %00011111
╬OW, WITH EACH STEP IN THE X DIRECTION, WE DO AN ARITHMETIC SHIFT ON X. ╙O
AFTER ONE STEP WE HAVE
X = %00001111
AND AFTER TWO STEPS
X = %00000111
AND AT THE THIRD STEP OF COURSE
X = %00000011
╬OW IT IS TIME TO TAKE A STEP IN ┘. ┬UT NOW LOOK: IF WE ┼╧╥ X WITH ITS
ORIGINAL VALUE XOLD = %00011111, WE GET
X ┼╧╥ XOLD = %00011100
WHICH IS EXACTLY THE CHUNK WE WANTED. ═OREOVER, X STILL REMEMBERS WHERE IT
IS, SO WE DON'T HAVE TO DO ANYTHING SPECIAL EACH TIME A STEP IS TAKEN IN
THE Y-DIRECTION.
╙O HERE IS THE ALGORITHM FOR DRAWING A LINE IN THE X-DIRECTION:
INITIALIZE X, DX, ETC.
XOLD = X
TAKE A STEP IN X: ╠╙╥ ╪
HAVE WE HIT THE END OF A COLUMN? ╔F SO, THEN PLOT AND CHECK ON Y
IS IT TIME TO TAKE A STEP IN Y?
IF NOT, TAKE ANOTHER STEP IN X
IF IT IS, THEN LET A=X ┼╧╥ XOLD
PLOT A INTO THE BUFFER
LET XOLD=X
KEEP ON GOING UNTIL WE'RE FINISHED
╘HIS SIMPLE MODIFICATION GIVES US A SUBSTANTIAL SPEED INCREASE --
ON THE OLD FILLED HIRES CUBE3D PROGRAM, ╔ MEASURED A GAIN OF ONE FRAME PER
SECOND. ╬OT EARTH-SHATTERING, BUT NOT BAD EITHER! ╫HEN FACES ARE NOT
FILLED, THE DIFFERENCE IS OF COURSE MUCH MORE NOTICABLE.
╘HERE ARE A FEW THINGS TO BE CAREFUL OF. ╘HERE WAS A BUG IN THE
OLD ROUTINE WHEN THE LINE WAS A SINGLE POINT. ╔N THAT CASE DX=DY=0, AND
THE PROGRAM WOULD DRAW A VERTICAL LINE ON THE SCREEN. ╘HERE ARE PROBABLY
SOME OTHER THINGS TO BE CAREFUL OF, BUT SINCE ╔ WROTE THIS PART OF THE
CODE THREE MONTHS AGO ╔ REALLY DON'T REMEMBER ANY OF THEM!
╘HIS TAKES CARE OF HORIZONTAL LINE CHUNKS -- WHAT ABOUT VERTICAL
CHUNKS? ╫ELL, BECAUSE OF THE WAY POINTS ARE PLOTTED THERE IS NOTHING
WE CAN DO ABOUT THEM. ┬UT, AS WE SHALL SOON SEE, IF WE USE AN ┼╧╥-BUFFER
TO FILL FACES WE WILL BE FORCED TO TAKE CARE OF THE VERTICAL CHUNKS!
╟ENERAL ╨OLYGON ╥OUTINE
-----------------------
╬OW WE CAN BEGIN THINKING ABOUT A GENERAL POLYGON ROUTINE. ╞IRST
WE NEED A LIST OF SETS OF POINTS, WHERE EACH SET CORRESPONDS TO A
POLYGON. ╘HE FIRST NUMBER IN A SET COULD BE THE NUMBER OF (X,Y,Z) POINTS
IN THAT SET, AND THE POINTS COULD THEN FOLLOW. ╙O A TRIANGLE COULD
BE GIVEN BY THE DATA SET:
3 -1 0 0 0 1 0 1 0 0
╘HIS WOULD BE A TRIANGLE WITH VERTICES AT (-1,0,0), (0,1,0), AND (1,0,0).
╫E CAN MASH A BUNCH OF THESE SETS TOGETHER, BUT SOMEHOW WE HAVE TO KNOW
WHEN WE'VE HIT THE END -- FOR THIS WE CAN USE A ZERO, SINCE WE DON'T
WANT TO PLOT POLYGONS WITH ZERO POINTS IN THEM.
╞OR THAT MATTER, HOW MANY POINTS SHOULD THERE BE IN A POLYGON?
╘HERE MUST BE AT LEAST THREE, OTHERWISE IT MAKES NO SENSE. ╙INCE WE
WANT OUR POLYGONS TO BE CLOSED, THE COMPUTER SHOULD BE SMART ENOUGH TO
CONNECT THE LAST POINT TO THE FIRST POINT -- IN OUR TRIANGLE ABOVE,
THE COMPUTER WOULD JOIN (-1,0,0) TO (0,1,0), (0,1,0) TO (1,0,0), AND
(1,0,0) TO (-1,0,0).
╬OW THAT WE HAVE A POLYGON, WE WANT TO ROTATE IT. ┘OU WILL
RECALL THAT WE HAVE CALCULATED A ROTATION MATRIX ═, WHICH ACTS ON
POINTS. ╙O WE NEED APPLY OUR ROTATION TRANSFORM TO EACH OF THE
POINTS IN THE POLYGON, I.E. MULTIPLY ═ TIMES EACH POINT OF THE
POLYGON. ╞URTHERMORE, WE NEED TO PROJECT EACH OF THESE POINTS.
╒H-OH: MATRIX MULTIPLICATION. ╔N THE PAST WE HAVE AVOIDED THIS
ISSUE BY PUTTING THE VERTICES OF OUR CUBE AT 1 OR -1. ╙O WE NEED TO
USE OUR MULTIPLICATION ROUTINE FROM LAST TIME. ┬UT WAIT! ┴S YOU RECALL,
THE LAST PROGRAM USED A SPECIALLY MODIFIED MULTIPLICATION TABLE. ╘O GET
A WIDER RANGE OF NUMBERS TO MULTIPLY WE WILL NEED ANOTHER SET OF
MULTIPLICATION TABLES -- NO BIG WHOOP.
╬OW, IF YOU REVIEW THE MULTIPLICATION ROUTINE FROM LAST TIME,
IT ADDS TWO NUMBERS AND SUBTRACTS TWO NUMBERS. ╫HAT KINDS OF NUMBERS
WILL WE BE DEALING WITH? ╘HE MATRIX ELEMENTS VARY BETWEEN -64..64.
╘HIS THEN FIXES OUR RANGE OF POLYGON COORDINATES FROM -64..64. ╫HY?
╔F THE MATRIX ELEMENT IS 64, AND WE MULTIPLY IT BY 64, THE MULTIPLICATION
ROUTINE WILL ADD 64 AND 64 AND GET 128, WHICH IS RIGHT ON THE EDGE OF
OUR MULTIPLICATION TABLE.
├AN WE IMPROVE THIS ROTATION PROCESS IN ANY WAY? ╔N FACT, WE CAN
CUT DOWN ON THE NUMBER OF MULTIPLICATIONS (I.E. DO EIGHT OR EVEN SEVEN
INSTEAD OF NINE MULTIPLICATIONS). ╚OWEVER, THERE IS A FAIR AMOUNT OF
OVERHEAD INVOLVED IN DOING SO, AND OUR MULTIPLY ROUTINE IS FAST ENOUGH
THAT THE EXTRA OVERHEAD AND COMPLEXITY REALLY GAIN US VERY LITTLE IN ALL
BUT THE MOST COMPLICATED OF POLYGONS. ╔N OTHER WORDS, ╔ DIDN'T BOTHER.
╫HAT ABOUT HIDDEN FACES? ┴GAIN, FROM LAST TIME YOU MAY RECALL
THAT A METHOD WAS DESCRIBED WHICH USED THE CROSS-PRODUCT OF THE PROJECTED
VECTORS. ╚OW DO WE IMPLEMENT THIS IN THE PROGRAM? ╫ELL, IF WE TAKE
THE FIRST THREE POINTS OF THE POLYGON, WE HAVE TWO VECTORS. ╠ET'S SAY
THESE POINTS ARE ╨1 ╨2 AND ╨3. ╘HEN ╓1=╨1-╨2 AND ╓2=╨3-╨2 ARE TWO
VECTORS IN THE PLANE OF THE POLYGON WHICH ARE CONNECTED AT THE POINT ╨2
(THIS ANALYSIS WILL OF COURSE ONLY WORK IF THE POLYGON LIES IN SOME PLANE).
─EPENDING ON HOW WE TAKE THE CROSS PRODUCT, THE SIGN WILL BE POSITIVE OR
NEGATIVE, AND THIS WILL TELL US IF THE POLYGON IS VISIBLE.
─EPENDING ON HOW WE TAKE THE CROSS PRODUCT? ┴BSOLUTELY.
V1 X V2 = -V2 X V1. ╫HAT IT REALLY BOILS DOWN TO IS HOW YOU DEFINE THE
POINTS IN YOUR POLYGON. ╙PECIFICALLY, WHAT ORDER THEY ARE IN. ╨OINTS
THAT ARE SPECIFIED IN A CLOCKWISE MANNER WILL GIVE A FACE POINTING IN
THE OPPOSITE DIRECTION OF A POLYGON WITH THE SAME POINTS SPECIFIED IN
A COUNTER-CLOCKWISE ORDER. ╔N MY PROGRAM, THE POLYGONS MUST BE ENTERED
IN COUNTER-CLOCKWISE ORDER (WITH YOU FACING THE POLYGON) FOR HIDDEN
FACES TO WORK THE WAY YOU WANT THEM TO ;-).
╧NE OTHER NEAT THING TO HAVE IS THE ABILITY TO ZOOM IN AND OUT.
╫E KNOW FROM THE VERY FIRST ARTICLE THAT ZOOMING CORRESPONDS TO MULTIPLYING
THE PROJECTED POINTS BY A NUMBER, SO THAT'S WHAT WE'LL DO. ╘HE MULTIPLICATION
ROUTINE RETURNS ┴=┴*┘/64, SO A ZOOM FACTOR OF 64 WOULD BE LIKE MULTIPLYING
THE POINT BY ONE. ┴LL THE PROGRAM DOES IS MULTIPLY THE PROJECTED POINTS
BY A NUMBER ZOOM, UNLESS ZOOM=64, IN WHICH CASE THE PROGRAM SKIPS THE
ZOOM MULTIPLY. ┬E WARNED! ╬O CHECKS OF ANY SORT ARE MADE IN THE PROGRAM,
SO YOU CAN ZOOM AT YOUR OWN RISK!
╘HE IMPORTANT THINGS TO REMEMBER ARE: WHEN ENTERING POLYGONS,
MAKE SURE THE NUMBERS RANGE FROM -64 TO 64, AND THAT YOU ENTER POINTS
IN COUNTERCLOCKWISE. ╧UR TRIANGLE EXAMPLE ABOVE REALLY SHOULD HAVE BEEN
ENTERED AS, SAY,
3 -64 0 0 64 0 0 0 64 0
╞ILLED ╞ACES -- ╒SING AN ┼╧╥ BUFFER
-----------------------------------
╫ELL WE STILL HAVE ONE THING LEFT, WHICH WAS ALLUDED TO IN THE
PREVIOUS ARTICLE: USING ┼╧╥ TO MAKE A FILLED FACE. ╙OME POSSIBLE
DIFFICULTIES WERE RAISED, BUT WHEN YOU PLOT A SINGLE POLYGON AT A
TIME, THE PROBLEM BECOMES VASTLY SIMPLIFIED.
╞IRST ╔ SHOULD PERHAPS REMIND YOU WHAT EXCLUSIVE-OR IS: EITHER
┴ OR ┬, BUT NOT BOTH. ╙O 1 ┼╧╥ 0 = 1, AS DOES 0 ┼╧╥ 1, BUT 0 ┼╧╥ 0 = 0
AND 1 ┼╧╥ 1 = 0. ┴S A SIMPLE INTRODUCTION TO USING THIS FOR FILLING
FACES, CONSIDER THE FOLLOWING PIECE OF THE DRAWING BUFFER:
00001011 ═1
00000000 ═2
00000001 ═3
00001010 ═4
╠ETS SAY WE MOVE DOWN MEMORY, ┼╧╥ING AS WE GO. ╠ET ═2 = ═1 ┼╧╥ ═2. ╘HEN
LET ═3 = ═2 ┼╧╥ ═3. ╘HEN LET ═4 = ═3 ┼╧╥ ═4. ╧UR LITTLE PIECE OF MEMORY
IS NOW:
00001011 ═1
00001011 ═2
00001010 ═3
00000000 ═4
╫HAT JUST HAPPENED? ╔MAGINE THAT THE ORIGINAL MEMORY WAS A SERIES OF
PIECES OF LINE SEGMENTS. ╫E HAVE JUST FILLED IN THE AREA BETWEEN THE
TWO LINE SEGMENTS, LIKE MAGIC!
╔F YOU STILL AREN'T GETTING IT, DRAW A LARGE SECTION OF MEMORY,
AND THEN DRAW AN OBJECT IN IT, LIKE A TRIANGLE, OR A TRAPAZOID, AND
┼╧╥ THE MEMORY BY HAND, STARTING FROM THE TOP AND MOVING DOWNWARDS.
┼╧╥ FLIPS BITS. ╔F YOU START WITH A ZERO, IT STAYS ZERO UNTIL
IT HITS A ONE. ╔T WILL THEN STAY ONE UNTIL IT HITS ANOTHER ONE. ╙O
YOU CAN SEE THAT IF YOU HAVE AN OBJECT BOUNDED BY ONES, ┼╧╥ING
SUCCESSIVE MEMORY LOCATIONS WILL AUTOMAGICALLY FILL THE OBJECT.
╥IGHT? ╫ELL, WE HAVE TO BE CAREFUL. ╧NE MAJOR PROBLEM IS
A VERTICAL LINE:
1 1
1 GOES TO 0
1 1
1 0
╬OT ONLY IS THE RESULTANT LINE DASHED, BUT IF THERE ARE AN ODD NUMBER OF
POINTS IN THE LINE SEGMENT, THE LAST ONE WILL HAPPILY MOVE DOWNWARDS IN
MEMORY, AND GIVE YOU A MUCH LONGER VERTICAL LINE THAN YOU EXPECTED! ╙INCE
ANY LINE WITH SLOPE GREATER THAN ONE IS MADE UP OF A SERIES OF LINE
SEGMENTS, THIS IS A MAJOR CONSIDERATION.
┴NOTHER PROBLEM ARISES WITH SINGLE POINTS: A ONE JUST SITTING ALL
BY ITSELF WILL ALSO GENERATE A NICE STREAK DOWN YOUR DRAWING AREA.
╔F YOU THINK ABOUT IT, WHAT WE IDEALLY WANT TO HAVE IS AN OBJECT
THAT AT ANY GIVEN VALUE OF X THERE ARE EXACTLY TWO POINTS, ONE DEFINING
THE TOP OF THE OBJECT, AND THE OTHER DEFINING THE BOTTOM. ╘HIS GIVES US
THE INSIGHT TO SOLVE THE ABOVE TWO PROBLEMS.
╞IRST LET'S THINK ABOUT VERTICAL LINES. ╔N PRINCIPLE WE COULD
PLOT THE FIRST AND LAST ENDPOINTS OF EACH VERTICAL LINE CHUNK, BUT THAT
IS EXACTLY WHAT WE DON'T WANT! ╥EMEMBER THAT THESE ARE CLOSED POLYGONS,
WHICH MEANS THAT THERE ARE _TWO_ LINES WE NEED TO THINK ABOUT. ╔F ╔
PLOT JUST A SINGLE POINT IN EACH VERTICAL LINE SEGMENT, THERE MUST
BE ANOTHER POINT SOMEHWERE, EITHER ABOVE OR BELOW IT, FROM ANOTHER
LINE SEGMENT, WHICH WILL CLOSE THE POINT TO ┼╧╥-FILLING. ╥EMEMBER, WE
WANT EXACTLY TWO POINTS AT EACH VALUE OF X: ONE WILL COME FROM THE
LINE, AND THE OTHER WILL COME FROM THE OTHER LINE WHICH MUST LIE ABOVE
OR BELOW THE CURRENT ONE.
╞URTHERMORE, WITH ANY CONVEX POLYGON THERE ARE EXACTLY TWO
LINES WHICH COME TOGETHER AT EACH VERTEX OF THE POLYGON. ╘HIS MEANS
THAT THERE ARE ONLY CERTAIN CASES WHICH WE NEED TO WORRY ABOUT.
╞OR INSTANCE, TWO LINES MIGHT JOIN IN ANY OF THE FOLLOWING WAYS:
\ / \ /
\ / \ /
\_____ _____/ \/ ETC.
╔F YOU DRAW OUT THE DIFFERENT CASES INVOLVING VERTICAL LINES, YOU CAN SEE
THAT YOU HAVE TO BE CAREFUL ABOUT PLOTTING THE LINES. ╧NE TRICKY ONE
IS WHERE TWO VERTICAL LINES WITH DIFFERENT SLOPES OVERLAP AT THE POINT
OF INTERSECTION.
╙O AFTER STARING AT THESE PICTURES FOR A WHILE, YOU CAN FIND
A CONSISTENT METHOD WHICH SOLVES THESE DIFFICULTIES. ┴S LONG AS YOU
FOLLOW THE FOLLOWING RULES, THE PROBLEMS ALL DISAPPEAR; THE LINE ROUTINE
NEEDS TO BE MODIFIED SLIGHTLY:
1) ╫HEN PLOTTING A VERTICAL LINE (I.E. BIG STEPS IN ┘ DIRECTION),
DON'T PLOT THE ENDPOINTS (I.E. X1,Y1 AND X2,Y2).
2) ╫HEN PLOTTING A VERTICAL LINE, CONSISTENTLY PLOT EITHER THE
FIRST PART OF EACH CHUNK OR THE LAST PART OF EACH CHUNK
(EXCLUDING THE ENDPOINTS OF COURSE). ╔N OTHER WORDS, ONLY
PLOT A POINT WHEN YOU TAKE A STEP IN X, AND THEN PLOT ONE
AND ONLY ONE POINT.
╬OW ╔ DEDUCED THESE BY STARING AT PICTURES FOR A FEW HOURS AND TRYING
DIFFERENT THINGS LIKE TOP/BOTTOM OF CHUNK, LEFT/RIGHT, FIRST/LAST, ETC.
┘OU CAN SEE THAT IN SOME CASES THIS ENSURES THAT ONLY ONE POINT APPEARS
ON A GIVEN LINE SEGMENT. ┬UT TO ME THE ONLY WAY TO CONVINCE YOURSELF
THAT THIS REALLY DOES WORK IS TO DRAW A BUNCH OF PICTURES, AND TRY IT
OUT! ┘OU HAVE CASES WHERE TWO VERTICAL LINES INTERSECT, AND WHERE
A VERTICAL LINE INTERSECTS A HORIZONTAL LINE.
┬UT THERE IS STILL ONE THING WHICH WE HAVE FORGOTTEN -- THE
CASE OF A SINGLE POINT. ╘HIS CAN HAPPEN IN, FOR INSTANCE, A POINTY
TRIANGLE, POINTING IN THE X-DIRECTION. ╚OW DO WE FIX THIS? ┬Y
SIMPLY AVOIDING THE POINT: IN THE LINE DRAWING ROUTINE, USE ┼╧╥
TO PLOT THE POINTS INSTEAD OF ╧╥┴. ╙INCE VERTICAL LINES SKIP THE
ENDPOINTS, VERTICAL-HORIZONTAL INTERSECTIONS ARE ╧╦. ╚ORIZONTAL-
HORIZONTAL INTERSECTIONS WILL FORCE THE POINT OF INTERSECTION TO
BE ZERO.
╒H-OH, WHAT ABOUT INTERSECTIONS LIKE -----*------. ╤UITE FRANKLY
╔ JUST THOUGHT OF IT, AND ╔ THINK MY PROGRAM WILL FAIL ON INTERSECTIONS
LIKE THESE. ─RAT. ╫ELL, THAT JUST GIVES US SOMETHING FOR NEXT TIME!
╧NE OTHER THING NEEDS TO BE MENTIONED: FOR ┼╧╥-FILLING TO BE USEFUL
YOU NEED TO DRAW THE POLYGON IN A SPECIAL BUFFER, AND THEN ┼╧╥ THIS BUFFER
INTO THE MAIN DISPLAY BUFFER. ╔F YOU TRY TO ┼╧╥ THE DISPLAY BUFFER DIRECTLY
YOU ARE GOING TO HAVE A WHOLE HEAP OF TROUBLE, SUCH AS THE CONCERNS RAISED
LAST TIME.
╞INALLY, THIS GIVES A SIMPLE WAY OF FILLING WITH PATTERNS INSTEAD
OF BORING MONOCOLOR. ╔NSTEAD OF ┼╧╥ (┼╧╥┬╒╞),┘ : ╧╥┴ (─╥┴╫┬╒╞),┘ YOU CAN
USE ┼╧╥ (┼╧╥┬╒╞),┘ : ┴╬─ ╨┴╘╘┼╥╬,┘ : ╧╥┴ (─╥┴╫┬╒╞),┘ (AS LONG AS YOU
PRESERVE THE ORIGINAL ┼╧╥ (┼╧╥┬╒╞),┘).
╫ELL ╔ AM EXTREMELY TIRED AND ╔ HOPE ├RAIG HASN'T SENT OUT ├=╚ACKING
WITHOUT ME! ╔ HOPE YOU HAVE FUN PLAYING WITH THE PROGRAM, AND ╔ WOULD BE
VERY INTERESTED IN SEEING ANY NEAT GEOMETRIC SHAPES YOU MIGHT DESIGN!
╨ROGRAM NOTES:
--------------
- ╚IDDEN FACES DEFAULTS TO "ON". ╔F YOU ENTER A SHAPE AND A BLACK
SCREEN COMES UP, HIT 'H' TO TURN OFF HIDDEN FACES (YOU PROBABLY
ENTERED THE POLYGON CLOCKWISE).
- ╘HERE IS NO PATTERN FILLING -- JUST SIMPLE ┼╧╥ WITH A TWIST:
THE ┼╧╥ BUFFER IS ┼╧╥'D INTO THE DRAWING BUFFER.
- ┘OU MIGHT START HOSING MEMORY IF YOU ZOOM TOO LARGE.
╙╠╩ 6/15/95
┴DDENDUM
--------
╙TEPHEN ╩UDD SJUDD@NWU.EDU
╠AST TIME WE PUT A CIRCLE INTO THE 2─ GRAPHICS TOOLBOX. ├HRIS
═C┬RIDE HAS POINTED SOMETHING OUT TO ME ABOUT THE ALGORITHM, WHICH MAKES
IT COMPLETE. ┴S YOU MAY RECALL, THE ALGORITHM GAVE A VERY SQUARISH
CIRCLE FOR SMALL RADII. ├HRIS TOLD ME THAT SETTING THE INITIAL COUNTER
VALUE TO ╥/2, INSTEAD OF ╥, GAVE A PERFECT CIRCLE. ╫HAT IS GOING ON?
╔F YOU RECALL THE ALGORITHM, WE ARE COMPUTING A FRACTIONAL QUANTITY,
AND WHEN THAT QUANTITY BECOMES LARGER THAN ONE, WE DECREASE ╪. ╫OULDN'T
IT BE A WHOLE LOT SMARTER TO ROUND OFF THAT FRACTION INSTEAD OF
TRUNCATE IT? ╧F COURSE IT WOULD, AND THAT IS WHAT STARTING THE COUNTER
AT ╥/2 DOES.
╙O, TO UPDATE THE PREVIOUS ALGORITHM, ┴ SHOULD BE INITIALIZED TO
╥/2 INSTEAD OF ╥, WHICH MEANS THAT WE CHANGE
╠─┴ ╥
TO
╠─┴ ╥
╠╙╥
FOR A PERFECT CIRCLE EVERY TIME.
BEGIN 666 CUBE3D3.2.S
═ ' ╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*@╘╩╚*"@╚*"@╚*"@
═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚'-415!(14┌@:┼5$1*"@╚*"@╚*"@
═╚*"@╚*"@╚*"@*@╘╩╚&=%3╒)'1:!╘05┼,3╒*@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩
═╚'-405)4140┌╚#<╧,3$╧.32@╚*"@╚*"@╚*"@╚*"@*@╘╩╚&9)3─┼32$5$.╩ ╫
═+╙$┘+╙─╘╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╥+├"@8╘]-4$╤%5$5$.╩ ╤,┬\╤-╥\┘
═-*"@╚*"@*@╘╩╚%8╙+├"@8╘]-4$╤%5$5$.╩ ╙+╙(╨+╙─╒╚*"@╚*"@*@╘╩╚%8╙
═+├&@8╘]-4$╤%5$5$.╩ ╓+╙$╘+╙─╒╚*"@╚*"@*@╘╩╚%8╙+├*@8╘]-4$╤%5$5$
═.╩ ╓+╙$╒+╙─╒╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
═╚*"@*@╘╩╚'=%3$╨╠╚$┼&╚$%,3*!'3╘53╚%=%3$╥@5$┴)4┌"@*@╘╩╚%!23╘=2
═04╓@5╘┼,3*!23╒1!5$6@0:!#54)%+╩"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
═╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╥+├"@*┌!╬15>@04┘$╚&┼-4%)/5─5$(:"@╚*"@
═*@╘╩╚&┘/5┌!7251(╚$9!4╒1%4╩!23╒5424┘%4╥╥@╚*"@*@╘╩╚$┴)1$1%3╩!3
═55)&04-%4╥╥@1─┼,3$5$╚*"@╚*"@*@╘╩╚$9!0╘53+*!!3─2@15┴44─&@5$]0
═╚%-%0╒)%5*"@*@╘╩╚%1%6%2@34534╘%'15,┴╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩
═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╙+├"@*┌!╞05-4
═╚$-(54┘+6:!,24┘%╚*"@╚*"@*@╘╩╚%)/551)3─4╬╚*"@╚*"@╚*"@╚*"@╚*"@
═╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╙
═+├&@*┌!╟14┘%4─%,╚%!/3%┼'3╘┌@4$╤/5*"@*@╘╩╚%=)5$┬@2$┼$1$5.╚$9!
═0╘53╚"┴╪+5!23╘150╒0╔*@╘╩╚$%.1*!:3╘]-╚$9%05154─4╬╚*"@╚*"@╚*"@
═╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚%8╙+├*@
═*┌!┼;╫(═0┼5&1─52╚$9)3$╤)3─>@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
═╚*"@╚*"@╚*"@╚*"@*@╘╩╚'1(25.@4%)/1╒)!3:!)4┌!)3┼1%3─1%1*!43┌"@
═*@╘╩╚$%#0╘]-4$%.6:!42$6@05)424-,1:!)3╩"@╚*"@*@╘╩╚&,]:$%#2╘┼.
═1╥╥@:┼5.+╩ ┘-:!)4╒-512┌@╚*"@*@╘╩╚&9/4╩!$151!24╤3╚$].╚%1(25.@
═4%)/1╒)!32╥@*@╘╩╚%)%042@5$┴%╚$%25$┼#3$4┴╚*"@╚*"@╚*"@╚*"@*@╘╩
═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚'=2251%╚%1/╚%53
═(:"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@
═╚*"@╚*"@*@╘╩╚&╒94╘5,1╩!72$5.╚%┼/54┘'╚$1)1*"@╚*"@╚*"@*@╘╩╚$5!
═1╘523%╞@1┼)%455%3┼2@╚*"@╚*"@╚*"@╚*"@*@╘╩╚&1/0╒1/4╩!!3─2@<╘%)
═3┼0╠╚$%.1*!(14%21*"@*@╘╩╚$=214%4╚&%21╒5-14┘4╚*"@╚*"@╚*"@╚*"@
═╚*"@*@╘╩╚*!┴0─]55*!)5*!!3─2@04)/550┌╚$)55*"@╚*"@*@╘╩╚*!%5─52
═34]21:"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚&-!346@3╒54╚$)9╚%1(1:!3
═04╒%╚&1/3╒*@╚*"@*@╘╩╚$%3╚$┼.╚&╞@5╘5.5"┌@╚*"@╚*"@╚*"@╚*"@╚*"@
═*@╘╩╚*"@╚"╓@<┼5"04┼9052@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚*"@╚*"@╚*"@
═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚'1(3╒5'2*!╔╚%-014%+╚%=)5$┬@
═5$┴%╚*"@╚*"@*@╘╩╚%1/3─=515.@3╘:@345.╚$%.1*!/1╩!!3─=,15.@*@╘╩
═╚$%.1*!(059%╚$┘/5*!,3╒9%+*!╔╚$%-╚*"@╚*"@*@╘╩╚$)%0╘]-1:!!4┌!3
═3╒5.1$┼.1┌!"4─%34╥╥@3╒*@*@╘╩╚$&@5$┼.2╘╤)3─>@0╒┼-0─%,+╩"@╚*"@
═╚*"@╚*"@*@╘╩╚*"@╚"╓@,:!├3╒))3┼1(24%.4┌ ╤,┌"@╚*"@╚*"@*@╘╩╚*"@
═╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@╚*"@*@╘╩╚' ╬<╥┌@=$┴)4┌!705.@
═5╒))5%1%3╩!54╘┼.1┌"@*@╘╩╚*"@╚*"@;4523$┼.╚#$╥."┌@╚*"@╚*"@╚*"@
═╚*"@*@╘╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*┬╚╩*@╘-(&]╥9╥ ─
═.# ╨, ╘-*╩!├3╘┘35$%.5%,-#6)╒9╞8╤(&5╤=2 ─,╙ ╨," [9─┼24╒2@0╘┴!
═4─%#5$52╚%-%5 ╒┬=69╞,┬!┼<74@)#,╪,# @.╫-%0╘].1*!#2$%204-415*@
═4╘54#65╧<╞)╒9┬!┼<74@)#0╨,# @.╓5╧<┬╒"549&15(-8╟5╞9╞5╥(&5╤=2 ─
═83,@.╫!215-534%"3%╞@5$┴%╚%1!4$6@5╘].)╒2@0─6@4┼5.3─┼.1╨╒╪,2!┼
═<74@)&9┬(#═╨3╘┼.5%.@1─]2╚$1205=)3─>@0:!,24┘%#7─╤(&5╤=2 ─9╞,@
═.╫1(15-%╚%╔%4─^@4$%'1:!!1$1215-315,->#(@97%╒("1╞9" [1$].)╒2@
═0╘].1─╤)0╒2@5╘┼42*!┬87-╔8╨╒┘,┬!┼<74@)&9┼#6]╠9'@@97%╒("1╞9 ╒├
═:'5╬:╥!┼<74@)&9┼#61╪(&5╤=2 ─-├<@.╫1(25.@25.@4╘┴!4─5$╚%=)5$┬@
═=#&@0─5,3╒<-9'─@97%╒("0╓. ╒╘96╒╨,2!┼<74@)&9┬(#═╧1╩!#3╒524╘4╠
═╚$-/54╤$╚$-/3─9,24-4╚%=)5$┬@6#$-=&5═<#(@97%╒("1╞8╥ [=$5-4$]2
═05)9╚%9!4─┼!0─╤%4╨╒┌=&5═<"!┼<74@)# ╥(#═╒4╘5$╚$9/4╩!"549&15*@
═4╒=!4"┌@╚&1/3┬=4╚%1/54-(+@╒┌,2!┼<74@)#(╥(#═╒4╘5$╚$)9╚$╒!5$┬@
═4─]55$┼.10╒┌,┬!┼<74@)#(╘(#═─3╘╪╟5*!43╒5#2*!42$531:!%251(15(┴
═#7╚╙(&5╤=2 ─,├8->├0@97%╒("0╥. ╒╦(&5╤=2 ─8├8@.╓-/3┼-404┘4╚%53
═142@1─]2╚$┴)1$1%3@╘@(" [4╒521─%#1:!$151%0╒1)3╘┌@+:!$3╘╪╟5*!4
═3╒5#2 ╒╚:61┼(&5╤=2 ─8├4@.╓%21:!355)&04-%4┌!(241$14╪_#69╔;&╨@
═97%╒("0╒," [85)%╚%=%╚%5324┘'╚&5╧<┬╒&24╤,/╨╒┴;╞=═87@@97%╒(#$╥
═," [=$┴%4─6@05)%╚#(╩4$─╧04┘'34%8╚$%.1╘╤%4╨╘-*╩!╓:6,-#79═8╫-┬
═(&5╤=2 ─9# ╤. ╒┬:╓=╬9"!┼<74@)&0╨,├ -8╞]╥9&5╥(&5╤=2 ─9# ╥,0╒╙
═<╫1┴<╟0@97%╒(#$╙-#0@.╒)/5┌ ┘╚$┼.╚%-#4─5%3╩!-14╒/4┼╞@052@,3 ╥
═- ╘-#2╩@:╘523─%,#0╒├:')╧=70@97%╒("1╞9╞0╥#6=┼=&┼╬(&5╤=2 ─9╞9┼
═- ╘-*╩!╙3╘╒%╚%9!4─┼!0─╤%4╨╘-9╓╤╧8╟┴═:6╪@/2 ─,╓8@.╫1(15-%╚$%2
═1:!54╘5$╚$┼.╚$-,14%224┘'╚%1(10╒╟;&]┬>&╒┴>" ]("0╘," [1%)!5╘┼.
═1┌ ╚1╘╤/0─%,*:!"549&15(-9╓╤╧8╟┼═:6╪@/2 ─-#$-9╓╤╧8╟┼═87@@/2 ─
═-#(-;&]├>&╒╔;┬ ]("0╒-╥ [=$┴%4╘6@05)%╚%53142@24┌@0╘╤%05))3─>@
═5$┴%#6╤╧8╫┴═87@@/2 ─-3@@.╓5╧<╩ ╚3$]#04╨╔╚$)51─9%4@╒╠;╓-┘;6┼╬
═(#╘@)#4┘#6╤╧8╫┼═87@@/2 ─-├ -<#%╪(#╘@)#─╥(#═╘2$531:!!4─6@5$5-
═4$]205)9╚%-43╒)!1╘4-<#%┘(#╘@)#─╙(#═╒4╘5$╚$┼.╚%!,3╒1424┘'╚%1(
═1:!04─]*14-424].#7 ╤>┬ ]("0┘- ╒╨,╟@@/2 ─.34@.╫1(15╞@05)%╚$┴%
═4─6@4╘^@5$┴!5*!710╒╨,╟─@/2 ─.38@.╘1/3┬=4╚$┴!5─6@5$^@4─5#04╤#
═54╤!5$6@5$┴%32╪-<#)┌(#╘@)&%┼#7 ╙>" ]("1┴9┬ [=$┴%6:!-04═%╚$╤)
═1─6@14%362╪-<#-┘(#╘@)&(╨#7 ╙>┬ ]("1┬,2 [=╘┴9╚$%21:!93╒6@3$]/
═2╘┼.1┌!!5*!-1:!,24═%╚%1(050_#7 ╤=" ]("1┬,┬ [9$].)╒2@64]5╚%12
═55-4╚$╒%/╨╒╨,╟0@/2 ─8├,-<#-╘(#╘@)&(╘(#═╚059)3─>@04┘/5$┴%4╩!#
═2$┼,1*!705-.)╒2@35╞@241%02╪-:6┘─97@@/2 ─-3$-8╓]╒;╟1╨=',@/2 ─
═-3(->╞]╧;2 ]("0╫,2 [>─]/3:!&04-43╒(-9'-╪(#╘@)#8╤(#═─<╫┬@25.@
═5$┴%╚$┼.0╒)%345.5*!&3╒(-(" @.╒)/5$%424┘'╚$%23╒5.1*!8#61╙>2 ]
═("0╓,┬ [<╘┼-24╤!4╩!&3╒*@9'-┘+*!─<╫╚-9'-┌(#╘@)#8╙#7-╪(#╘@)#8╘
═(#═╘2$531:!!4─6@5$┴%╚$%#5%5!3*!!3─=,15.@24┌@6*!9╚$%.1*!:#7-┘
═(#╘@)#8╒#7-┌(#╘@)#8╓#70╤(#╘@)#8╫(#═╘2$531:!!4─6@55-%1*!)3╩!4
═2$6@4─]4051)3╘╪-=#(@/2 ─-├@-=#,@/2 ─-├─@.╫-%1:!42$6@05)424-,
═1:!&3╒*@34]21:!$151!24╤3#70╘(#╘@)#9┴#70╒(#╘@)#9┬#70╓(#╘@)#9├
═#70╫(#╘@)#9─#70╪(#╘@)#9┼#70┘(#╘@)#9╞#70╤," ]("0╫, ╒┴,3$@/2 ─
═834@.╫1(15-%╚$%21:!42$6@14╤%345.5%.@3╘:@5$┴%╚%)/5$%424].╚$╒!
═5%))6 ╒┬,3(@/2 ─838@.╫┴┘>@╒├,3,@/2 ─83<-9#(╤(#╘@)&$╪(#═╘2$6@
═3┼5-0─52╚$1%3─]415.@*%)/5╥╤#3╘╤534╪╔#64╥,┬ ]("1┴.0╒╞,├,@/2 ─
═86$-9╙,╤(#╘@)&%┬#6@╙,┬ ]("1┴8╨╒╔,╙,@/2 ─860-#0╘╩*┬╩@;4%#4─]3
═#0╒═;╫9┼(&╒┴8╨╘@;&1┴(%╘╤#2!╙=&$@73(-(#╨\/ ╘-9╓5╘:╓5┘(&╒┴8╥ @
═.╫=!252@1─]2╚$&@2╘594%)%4╒,-=╓%╔="!╩<╫(@9╓5╘:6╪-(&-═<" ├,# -
═(&)┼<2!╫86┼╘#2 \/#╨-#61┼8╟5╟(&╒┴8╥ @.╫!224┘4╚$&@0╘┴!4─%#5$52
═#2!─;┌ ╨╚* [9$].)╒2@05-314╒"3$4-#2!╠9&&@(╒╘╤#2!╩<╫*@8╓┴╥;╫5╘
═#2!├;&─-(#╪^/┬!╟971╦97─@.╓%.1*!704┼4╚%1/╚$-/3┼1)3┼5%#2!├;7 @
═(╥=3)╥ [;5╞@4╘5#4─5#5*!35╘┼40╘┬@2╘59#2!┬;╞4@;#$-(&╔╙<┬!├;&5┴
═;╟5╨#2!╩;7 @9&]╬90╒╠,2!├;7 @(╥=8)╥ [;5╞@4╘5#4─54╚$%"3╒)4╚$═%
═60╘@8╞┘┼(&1╧;╞4-(&╔═<"!├;&5┴;╟5╨#2!╞:6╪-9&]╬92 \/#╨-#61┼8╟5╟
═82!═86,-(&1╧╚# -(&╤─82!=,0╘@<╫1┴(#$╨,├0-(&9╔;@╒─;╓┘┼82 \/#╨-
═#2╚═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═#0╘@;&1┴(",─,# -
═('-╘82!┬:╓=╬9 ╘@<╫1┴(&)╧<╞1┼<@╘@;&1┴('9═8╫-┬#2!┴;╞0@(╥4╨,# ╨
═,3$╤,2 [<╘-2145.╚$╒%34]26:!43┌ ╤,#(╘#2!╧<╞$@(╥4╨,# ╤,# ╨, ╘@
═<╫1┴('9═8╫-┬#0╘@;&1┘(",╨, ╘@;&1┴(",\='1┼>'0-('-╘82!╘96╒╨,0╘@
═;&1┴(",^='1┼>'0-('-╘82!╘96╒╨,@╘@:╞╒╨('1╔=&╤┼#71╘97┴╘(&┴┼>" ┘
═,╙ ╒,3$╤,3$╤(#═#3$5!4╩!30╒)%14╪╠╚%=(251%+*!#4┼-2╚$1.#2!╘>'0@
═)┌"@╚*"@╚*"@╚*"@╚*!#54)%,╘2@5├,╬,┬<╠,$0╠,$0-('1╪=" ╟╚*"@╚*"@
═╚*"@╚*"@╚*"@╚*"@0┼─╟+#!$#2!╚97@@.68@.╘-904╪-('1╪=" ╟╚*"@╚%-4
═15!(14┌@2┼5$1"<-(&┴┼>" ┘.0╘@='┴╘(">@╚*"@1╘5/4─=%╚%1!64╤/4┬<╠
═,$0╠,$0-(&┴┼>" ┘8@╘@='┴╘(">@╚$-(14-+╚$]55*!42$6@2─%.+╩ ┘-:!)
═4╒-51:!/1┬<╠,$0-(&┴┼>" ┘-@╘@='┴╘(">@╚$,]2$%#2╘┼.1╥<-(&┴┼>" ┘
═8@╘@='┴╘(">@1─]2╚$╒/4─6@1$5404┼,4╥$╟+#!$#2!╚97@@,&0╤9#%─.64╤
═,@╘@='┴╘("=&,2]&,┬<╠.3(-('1╪=" ╟╚"╓@24┘#+╘1%0┌!8+5)/5$%424].
═)╥╨╨1 ╘@:&5╪(#%─,60╤,@╘@='┴╘("=&,╥]&-"<╠.3(-('1╪=" ╟╚"╓@24┘#
═+╘1%0┌!9+5)/5$%424].)╥╨╨1 ╘@:&5╪(#%─,60╤,@╘@='┴╘("=&-2]&-┬<╠
═.3(-('1╪=" ╟╚"╓@24┘#+╘1%0┌!:+5)/5$%424].)╥╨╨1 ╘@:&5╪(#%─,60╤
═,@╘@='┴╘(">@1├>@╚"<╠.3(-('1╪=" ╟╚"╓@4─53150╟+#!$#2!╚97@@,60╤
═9#$╥#2!╘>'0@)┌ ╦+╥╓@)╥╨┘,@╘@='┴╘(">@+:!:3╘]-╚$┼.+╘]55"<╠,$0-
═(&┴┼>" ╤9#%─,3(-('1╪=" ╟╚*!(╚* ╟+#─╥#2!╘>'0@)┌ ═╚%1/1╘=,1:!(
═241$14┌@4╒521─%#15,╟+#!$#2!╚97@@,60╤9#$╥#2!╘>'0@)╒-004-%)╥╨┘
═,@╘@='┴╘(">@+:!43╘='3$6@4╒521─%#1:!&24╤,24┘')╥╨╨1"╨╨1 ╘@='┴╘
═(">@╚%!215-3╚%&@5$^@455)5"<╠,$0-(&┴┼>" ╨9# ╒#2!╘>'0@)┌"@╚*"@
═╚%!215-3╚$%.6:!+15╞@5$^@0─5'24╪╟+#!$#2!╚97@@,# -=&┼╘;&4@;&1┴
═("┴╘96╒╨,2─╠>0╘@8╞5╤(#╔├;╓┘╘#2!╩<╫(@8╓┴╥;╫5╘#2!╔;╟─-(&)╬92!╘
═:71╠90╘@:6┘├('1┼;7 ╥#2!╩;7 @=&┼╘;&4-.╞-╧;╟0@/├╪^(&=┼=&═┼>0╘-
═*┬╚╩*╩!╙152@55"@5$%"3$53*#\╔#0╘╩╚'1!0─╤%4┌!!4─6@0╒524─5.5$╤9
═╚%-%5*!54*!)3╩!┬87-╔8╨╘╩╚$%.1*!"6:!42$6@05-314╒"3$52+@╘-=&%┬
═;&5╙(&╤─82 ├/╟1═871╚,0╘@<╫1┴('╚╤*╙$-('-╘82!┌,┬╠╤#2!╠9&$@(╙┘╘
═;6%╘:#(-('-╘82!┌,╥╠╤#2!╙=&$@>├0╦,0╘-*┬╚╩*╩!├3$5!4╩!30╒)%14┌@
═04┘$╚%-%5*!54* ┬0─┼434%0(@╒╙971╒<"!╠9&$@(╥0╨,2 [=╘┴)5$4-('-╘
═82 ─9# ╥,2 [=$┴)4┌!)4┌!$3╘┘%╚%-/╚%1(052@3╘╤$15(-(&╤─82 ├,30╫
═(#═-04-(24┘%4┌!724╤,╚%-%5*!54 ╘@:╟-╥(&-╚<╞]╒= ╘@;&1┴(",─,# @
═.╘-/4┼)%0╒1,60╘@<╫1┴("1─,#(╤#2!╠9&$@(╙╤╙<╫1┴<╟0-(&%─8╥ ├,3(@
═.╫1(1:!'3╘%,╚$┼3╚%1/╚$-%3┼1%4╩!42$6@1╒)!4$┴)0╒,-('-╘82!╘96╒╨
═,2 [8╘],54╒.╚#$╥#2!╠9&$@(╙┘╙<╫1┴<╟0@.╫)/5┌ ┘#2!╙=&$@=&5═<#$╦
═,2 [<╫-╘87)╘╚%!/24┘44┌!43┌!23╒>@.0╘@;&1┴(",╨, ╘@;&1┘(",╨, ╘@
═;&1╪(",╨," [6*!724╤,╚$-/54┘4╚#$╓╚%)/5╒.@1─]2╚%53#2!├;&,-#3╔╠
═;╓]╨('-╘82 ╚=&5═<#$╔+'─-(&┼╬>0╘@861├(",╤-@╘@8╞-├(#╔╠;╓]╨#2!├
═;&,-(&╤─82!╘96╒╨,0╘@861├(",╘," [;─5%1*!43┌!!1$2@-#"@5$^@5$┴%
═╚$)!4╘6@4$])3┼1%4@╘@<╫1┴('1┼;7 ╤(#═╘3┌!*54╒0╚%1/╚%1(1:!.15┴4
═╚%)/5╨╘@;&1┴('1┼;7 ╤*╙$-(&%─8╥ ├,# @.╫1!2╘6@0╘%21:!/1╩!#05)2
═2453#2!╙=&$@=&5═<#$╦,0╘@;&1┘(",╨, ╘@:6┘╪#2!╘>&$@(#═╪╚$┼3╚$%,
═4╘^@04┌@24┘$15┬@24┘43┌!42$6@0╘┴!4─%#5$52╚$┘534)%4@╘@8╫!╪(",╤
═-@╘@8╞┘┼(#╔╠;╓]╨(#═╬145$╚%1/╚$1/╚$┼4╚#$╓╚%1)3453#0╘╩*┬╚╩╚&-,
═14%2╚$)51─9%4┼,-#2!╠9&$@(╙╤┬=69╞,0╘@<╫1┴(&)╒9╞9┼<@╘@;&1┴(",^
═8╟5╞9├$-('-╘82!┬=69╞97(╦,0╘@;&1┘(",─,# -(&╤─>" ├,├0@.╓%34╒5-
═24┘'╚$%,3*!42%)%1:!"549&15)3╚$%210╘@;&1┴(",─,# @.╘)!0╘╠═5$\═
═0─%#2╨╘┌8╞╤╧;╫ @<╫1┴("┴┬=69╞97(╔+'─-(&┼╬>0╘@8╞┘┼(#╔┬;&]╧< ╘@
═:6┘├(&)╒9╞9┼<┬╠╤#2!─97@-(&)╬92 ┌8╞╤╧;╫ -#2╚╩*┬╩@<╘54╚%50╚$)5
═1─9%4┼,-#2!╠9&$@(╙╤┬=69╞,0╘@<╫1┴(&)╒9╞9┼<@╘@;&1┴(",^8╟5╞9├$-
═('-╘82!┬=69╞97(╦,0╘@<╫1┴('╔╘96╒╨(#═:5$5-4*!724╤,╚$╒!2╘6@3$┼&
═1:!324╒03$6@1─]2╚%53#2!╠9&$@=╞╒├<╓(-(&%╬9" ├)3$╤,3$╨,# ╤(#═╙
═5$%25*!(15)%╚%-/╚%1(052@4╒=!4*!"549&15)3╚%=)3$╥@5╘]22┌!224=(
═5 ╘@;╫)┴(",┼,# ╨,#$╤,3 -('-╘82!╓;6-╙8@╘-*┬╚╩*╩!╙152@55"@24┘)
═5$┼!3*!604╤515,-#6┼╬:70@;&1┴(",╨, ╘@<╫1┴(&╤╧8╫┴═:6╪-('-╘82!╠
═;╓-╪;6%╪#2!╙=&$@;&]├>6╒╔;@╘@<╫1┴(&╤╧8╫┼═87@-('-╘82!╟;&]┬>&╒╔
═;@╘@<╫1┴(&=╠;╓)┘;6┼╬#2!╙=&$@9╓╤╧8╟┴═87@-('-╘82!╟;&]┬>6╒┴> ╘@
═<╫1┴(&1╙> ╘@<╫1┴(&1╙>0╘@<╫1┴(&1╙>@╘@<╫1┴('-╪#2!╙=&$@<╫─-('-╘
═82!╙>@╘@<╫1┴(&9╔;&╨-(&╤─82 ├,#$-('-╘82!╚:61┼#2!╠9&$@(╙8╘#2!╙
═=&$@>╞]╧;0╘-*┬╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘-*╩!═
═04┼.╚$╤/3╒ -#2╚╩*┬╩@9╘54╚$═%65!215-3#0╒═86┼╬#2!├;&─-:╫!╥97-╙
═(&╔╙<┬!╟971╔;@╘@8╓╒╨(",╤,╙,@.╓8╤/╨╘@8╞┘┼(#╔╞,@╘@;&1┴(&1╙> ╘@
═8╓╒╨("-┴;╞=═87@╧,┬ [;─^@34]21:!42$%.╚%!)#2!┬97$@.╞-╧;╟0╤#2!╔
═;╞,@9'-╪(#═/5$┴%4┼=)4╘6@24┘#4─5!4╘6@6"╒23╒1!5$┼/3@╘@:╞╒╨(#╔├
═;╓┘╘#3╔╞,┬!├;7 @(╙$╙-╥ [9├(_#2!┬;╞4@.╞8╙#2!╠9&$@9'-╪#2!┬97$@
═.╞-╧;╟0╤#2!─96,@9'-╪#2!╩;7 @.╞-╧;╟0-.╞8╙(&-═<" ├,3,╘#2!┬;╞4@
═.╞8╘#2!╠9&$@9'-┘#2!├;7 @(╓%╬9╓╒┴>"\╥#2!┬97$@.╞-╧;╟0╤#2!╔;╞,@
═9'-┘(#═╔3─-214%31:!9+5)/5$%424].#2!╩;7 @.╞-╧;╟0-.╞8╘(&-═<" ├
═,3,╪#2!┬;╞4@.╞8╒#2!╠9&$@9'-┘#2!┬97$@.╞-╧;╟0╤#2!─96,@9'-┘#2!╩
═;7 @.╞-╧;╟0-.╞8╒(&-═<" ├,3,╒#2!┬;╞4@.╞8╓#2!╠9&$@9'-┌#2!├;7 @
═(╓%╬9╓╒┴>"\╥#2!┬97$@.╞-╧;╟0╤#2!╔;╞,@9'-┌(#═:+5)/5$%424].#2!╩
═;7 @.╞-╧;╟0-.╞8╓(&-═<" ├,3,┘#2!┬;╞4@.╞8╫#2!╠9&$@9'-┌#2!┬97$@
═.╞-╧;╟0╤#2!─96,@9'-┌#2!╩;7 @.╞-╧;╟0-.╞8╫(&-═<" ├,3,╓#2!┬;╞4@
═.╟!╠=7,-(&╔═<"!╔;╞┼╘#3╔├;╓┘╘,2!╩;7 @.╞-╧;╟0-.╟!╠=7,@8╓╒╨(",╟
═*╥<-(&)╬92 ┌;6┼╬=7,-(&┼╬8╥!┌;╓]═(#═┬04@╠╚%=(3┌!.145$4┌!%4┼)/
═4╩!#2$5#2╘┼.1╙\-(&┼╬8╥!┌;╓]═#2!╩;7 @.╞-╧;╟0-.╞╒╔;╟5╙(&-═<" ├
═)╥╘╟#2!┬;╞4@.╞@-(&1┼8╥!┌;╓]═#2!─96,@>╞]╧;0╘@8╟!╠(#╔├;╓┘╘#2!╔
═;╞,@>╞]╧;0╘@:6┘├('╔╧;╓╘-(&╔═<" ┌8╓]╬= ╘┌:"!├;7 @(╥=()╨╘@8╞┘┼
═(#╔╙<&%├90╘@;&1┴(&┴╔9&4-(&5╧<┬ ├)# ╤#2!╙=&$@:&┼─90╘@:╞╒╨(#╔├
═;╓┘╘#3╔╙<&%├92!├;7 @(╥>@)╨╘@8╞┘┼(#╔╤#2!╠9&$@9╞┼╠; ╘@96]╥(",─
═,#$-('-╘82!╞:6╤╠#2!╩;7 @.╞-╧;╟0-.╟$@8╓╒╨(",╟42<@.╒&@455)5%,-
═(&)╬92 ┌8╓]╬= ╘@:╞╒╨(&-╠96%╬=7 -#3╔├;╓┘╘('-┼:2 @.╫-0145$╚%1(
═24┘'4┌!54*!!╚$))5 ╘-*┬╚╩*╩!╒4$1!5$6@04┘'3$53#0╒╒<&1┴=&4@8╓╤├
═#2!╠9&$@<╫@-(&%─8╥!─<╫@-(&-═<" ├86┘╟;6%╪(#═┴4─6@5╘6@/├╓@34%8
═24╒53:!!3─=,13\-(&)├8╥ ┌8╓]╬=#$-('-┬8╥ ├86┘╟;6%╪(#╔╔1┬!33╥╨@
═4─53150-.╞-╧;╟0╤('-╘82!╙> ╘@8╓╤├#2!╠9&$@<╫─-(&%─8╥!─<╫─-(&-═
═<" ├86┘╟;6%╪#2!┬8╓,@.╞-╧;╟0╥#2!╙8╞,@(╓%╬9╓╒┴>" [<╘%-1:!$14%,
═#3╔├;╓┘╘,┬!╙=&$@<╫─-(&-╠8╨╘@;&1┴('-┌#2!┴9&,@9'-┌#2!├;7 @(╓%╬
═9╓╒┴> ╘@8╞-├(#╔├;╓┘╘,╨╘@<╓)├("-┴;╞=═87@-.╞-╧;╟0╙('-╘82!╙>@╘-
═*┬╚╩*╩!╥3╒1!5$6@0╘]/4─1)3─%415,-#7)╧=&%╘90╘-*┬╚╩╚&9)4┼-4+*!#
═04╤#54╤!5$6@5#$╠5#(╠+┬╪╬+%0╤, ╘-*┬╩@=%=/╚$╒!0╒)/4┌!43┌!324╒0
═3$┼&6:!/55*@3$┼&10╒┴9&1┴(&╒┴8╥ @.╓%$1*!45╘^@04┘'3$53╚%1/1╘54
═2$52#2!├;&,-(&╤─82!=,0╘@861├(%╘╥#2!├;7 @(╓%╬9╓╒┴>" [:5.@5$┴%
═╚%-53: ^╚#(╩4$─_#2!┬8╓,@9&]╬90╘@<╓)├("-┴;╞=═87@@.╓┼&╚%-/+*!3
═54)44─%#5* ╥*┼!)#61╧;╞4@/#╨\#0╒╙=6)┴(&╒┴8╥ @.╫-50┼1204-4╚%17
═3┌!!3─=,15,-('-┼8╨╘@;&1┴(%╘╤#2!╙8╞,@73(-(&)├<╥!─;╓┘┼#2!┴9&,@
═(╓%╬9╓╒┴>" [;╘]04╥╥@5╘6@3─5%1*!43┌!!1$2@,┬╔020╒─;╓┘┼(#╨\/ ╘-
═*┬╩@;─]7╚$-!3$-53$%41:!4,2╤4,┬╤%5$,╬#0╘@/├╪^('-╒8╞$╠<╫─[<╫╚-
═('-╘82!╘,2 [5#$]4╒─═4╒╚-(#╪^/┬!┴9&1┴+'-┘.╫-┌#2!╙=&$@=#(@.╒0╥
═/5-9*╒-:#2 ^/├╪@861─82╤╙>#═╙>@╘@<╫1┴('0╙(#═4,╙╒36"═36@╘@/├╪^
═('-╒8╞$╠<╫@[<╫╚-('-╘82!╘-" [5#0]4╒@═4╒╚-(#╪^/┬!┴9&1┴+'-╪.╫0╥
═#2!╙=&$@=#4@.╒0╒/5-8*╒0╥#2 ^/├╪@<╫5┬82╤╙>#═╘,0╘@<╫1┴('0╓(#═4
═-├╒36"╒4,0╘@/├╪^(&%─9&$╠<╫@[=#$-('-╘82!╘-╥ [5#<]4╒@╦5#$-(#╪^
═/┬!╙=6)┴+'0╥.╫-╪#2!╙=&$@=#@@.╒0╪/50╥+5-8#2 ^/├╪@<╫5┬82╤╙>3═╙
═> ╘@<╫1┴('0┘(#═4.3╒362╒36 ╘@/├╪^(&%─9&$╠<╫@[<╫─-('-╘82!╘,3 @
═.╒0╤,#╒36"═360╘-*╩!┼5*!63╘┼,02$-#2╚╩*╩!╬15┴4+*!#04╤#54╤!5$6@
═82╤┬+&,╠+┬╪╬+&─-#2╚╩╚&%.3╒1(15*@55-%1┼5,╚$╤)5%1,1:!-04-23╨╒─
═:78╥(&╒┴8╥ @.╓1)5─┼$1:!!╚%-)1╘┘%1*!.54╒"15*@0┼╞@,@╘[:52@25.@
═05-354╒%1*!42$%4╚%1(1:!.54╒"15(-(&)╨;"!╨;╫,@.╘┼3╚$┼.╚%1(1:!!
═0╘-5355,051/4@╘@8╓╤├#2!┼;╫(@(╥1╞9┬ [=╘6@3─5%1*!43┌!53┬╒.14=!
═5$┼61:!42$6@3┼5-0─52#2!┴9&,@(╙ ╤(#═"6:!404═)3─>@250╟4┌!#3╘╒0
═3$5-14┘4#2!╠<╫(@(#═$259)1$6@0┼╞@5%=/#2!├;&,-(&5╧<┬ ├)&9╞#2!┴
═9&,@(╙ ╤(#══04═%╚$┼4╚$┘%1╘%4259%╚$%'04┼.#2!╩;7 @9&]╬961╔=@╒╨
═;╫,@;'-╥(" [;┼5-0─52╚$┼3╚%!/4╘┼4259%#61╧;╞5─:78@/#╨\#0╒═=6╨╥
═(&╒┴8╥ @.╓╒53%1)4$╤9╚$&@4╘┼'3─5$╚$┘534)%4╩!"6: ╥#2!┬<&╨@<&]╙
═;0╘@8╓╤├#2!┼;╫(@(╥1╞9@╘@861├(",─,#$-(&%╙; ╘@8╓╤├#2!┼;╫(@(╥1╞
═9@╘@861├(",─,#$-(&╔═<"!─;╓┘┼;75╠#7!╧<╓╘@87-╠#61╧;╞5═=6╨@/#╨\
═#0╘╩*╩!╬3╒1%╚%1(052@5╘6@05)%╚$-54┼)%3┼1,6:!-04═)3─>@0:!-24┘/
═4╩!,14%0#2╚╩╚$]&╚$9!251(╚%1(052@3─^@3╒9%4─9,3╒=3╚%=)3$╥@3╘-#
═55(╬#0╘┌8╓%╠8╓$@8╓╤├#2!╠9'@@=#$-(&╤─82!├;╫,╠> ╘@;&1╪('0╥#2!┴
═9&,@8╓]╙+'@-('-╘82!┴,3$@.╓$]*$-/4╥┴4,2─╦0╘]3*%0╥*2─╧,@╘┌8╓%╠
═8╓(@;&1╪('0╤#2!╠9&$@<╓┼╬+'@-('-┼8╨╘@;&1╪('0╥#2!╙8╞,@<╓┼╬+'@-
═('-╘82!┬,3(@.╓(]*%-)3┬┴4,2─═4╘┼.*%0╥*2─╧,@╘┌8╓%╠8╓,@;&1╪('-┘
═#2!╠9&$@<╓┼╬+'@-(#╪^/┬!═=6╨╥#2!╙=&$@8╙$╙(#═├/5-)3┬┴362─-.╞-┴
═;&-─('-┼8╨╘@;&1╪('0╪#2!╠9&$@8╓]╙+'@-(&╤─>"!╘-╨╘@<╓)├(&-╧<╥╤╪
═#2!╙96,-(&╤─>"!╘-0╘@<╓)├(&-╧<╥╤╪#2!├;&,-(&╤─>"!╘-@╘@861├(&-╧
═<╥╤╪(#═─23╘╚0╘]3*%0╪*2╒#3╒,╚5#<╔*╘-/4╥┴4-┬─═0╘]3*%0╒*2─╧,@╘@
═/├╪^(&1╔=├(-(&-╠8╨╘@;&1╪('0╙#2!┴9&,@<╓┼╬+'@-('-┼8╨╘@;&1╪('0╘
═#2!╙8╞,@<╓┼╬+'@-('-╘82!─,├$@.╓0]*%-)3┬┴4,╥─═4╘┼.*%0╘*2═─22─╧
═,@╘┌8╓%╠8╓4@<╓5├#2!╠9'@@=#4-(&╤─82!╙:6╪╠> ╘@;&1╪('0╓#2!╙8╞,@
═<╓┼╬+'@-('-┼8╨╘@;&1╪('0╫#2!╙8╞,@<╓┼╬+'@-('-┼8╨╘@;&1╪('0╪#2!╙
═8╞,@<╓┼╬+'@@.╓5)/2┴324╪╚5#4╔+5-)3┬┴4-┬─═4╘┼.*%0╫*2╒324╪╚5#@╔
═*2\╥#2 ^/├╪@9&┼╓,@╘@8╓╤├#2!╠9'@@=#,-(&%─8╥!├;╫,╠> ╘@8╓╤├#2!╠
═9'@@=#0-(&%─8╥!├;╫,╠> ╘@<╫1┴(&4╥,┬ [93╘╚0╘]3*%0╙*2═#3╒,╚5#0╔
═*╓5)*2\╥#3╔├86╤├9┬!╠9'@@=#─-(&╤─82!╙:6╪╠> ╘@<╓5├#2!╠9'@@=#$╨
═#2!╙8╞,@<╓┼╬+'@-('-╘82!╞,├,@.╓8]*%-)3┬┴4.2─═4╘┼.*%0╤,"─╔+╙(-
═.╞-┴;&-╟(&╤─>"!╘-@╘@;&1┴('-╔;┬╤╪#2!╙96,-(&╤─>"!╘. ╘@<╓)├('-╔
═;┬╤╪#2!╙96,-(&╤─>"!╘-╨╘@<╓)├('-╔;┬╤╪#2!╙96,-(&╤─>"!╘-0╘@<╓)├
═('-╔;┬╤╪(#═╟23╘╚4╘┼.*%0╓*2╒324╪╚5#@╔+5-)3┬┴4-╥─═4╘┼.*%0╒*2─╧
═,@╘@/├╪^(&1╔=├(-(&-╠8╨╘@;&1╪('0╘#2!┴9&,@8╓]╙+'@-('-┼8╨╘@;&1╪
═('0╙#2!╙8╞,@8╓]╙+'@-('-╘82!╟,╙$@.╓<]*$-/4╥┴4-"─═0╘]3*%0╙*2═╟
═22─╧,@╘┌8╓%╠8╓@@8╓╤├#2!╠9'@@=#8-(&╤─82!├;╫,╠> ╘@;&1╪('0╫#2!┴
═9&,@8╓]╙+'@-('-┼8╨╘@;&1╪('0╒#2!╙8╞,@8╓]╙+'@-('-┼8╨╘@;&1╪('0╪
═#2!╙8╞,@8╓]╙+'@@.╓┴)/2┴#3╒,╚5#8╔*╘-/4╥┴4-╥─═0╘]3*%0╒*2╒#3╒,╚
═5#@╔*2\╥#2 ^/├╪@9&┼╓,@╘@8╓╤├#2!╠9'@@=#,-(&%─8╥!╙:6╪╠> ╘@8╓╤├
═#2!╠9'@@=#0-(&%─8╥!╙:6╪╠> ╘@<╫1┴(&@╙,┬ [:#╘╚4╘┼.*%0╙*2═324╪╚
═5#0╔*╓┴)*2\╥#3╔╫:&5╫(&-╠8╨╘@;&1╪('0┘#2!╠9&$@8╓]╙+'@-(&╤─>"!╘
═,3 -(&%─8╥!├;╫,╠> ╘@<╫1┴(&─╙,╥ [:3╘╚0╘]3*%0┘*2═#3╒,╚5#$╨*2─╧
═,@╘-*┬╩@:50╟4┌!!3$╥@1$]73─┴)3$╥@1┼)/3:!(15)%+@╘-9&]╫;╞┴╔;&╨-
═*┬╚╩*╩!├3$5!4╩!"549&15(-*╩!┴╚$╤)5%1,1:!-04-23╨╘-<╓5╘8╟5╞(&╒┴
═8╥ @.╫!55*!"549&15)3╚%=(15)%╚%1(15╞@0╘%.╚$)%╚$┴54┼0-(&╤─82 ├
═,# -('-╘82!┬=69╞97(-(&╤─82!┌=&5═<" [:$┼'2*!"651%#7-╘86)╒9┬!╙
═=&$@8╟5╞9╞5╥*╙$-(#╨\/ ╘-(#╪^/┬!╙971┬=68-8╓╤╥9')┴=╥!╠9'@@(╙ ╪
═#2!╠9&$@(╙ ╨#3╔╞;╓]╠(&╤─>2 ├,# -.╞1╧<&4@<╫1┴("┴┬=69╞97(╔+'─-
═(&┼╬>0╘@8╞┘┼(#╔─;╫!┼#2!╔;╞,@8╟5╞9╞5╥*╙$-(&1┼> ╘@8╞┘┼(#╔╞;╓]╠
═#0╘╩*┬╚╩╚&╒9╚$=/3╘1.15-3╚$)55*!╔)╘╓@0:!$3╒!%#2╔├;')─<╞%╫╚&╤─
═8:!╟;&]┬>&╒╔;@╘╩╚&╤╙<╩"@.╓┘%142@5$^@1╘54╚$┼.5$^@5$┴%╚%))1╘┴4
═╚$-/3%5-3@╘╩╚&)├8┌ ┌979┼;╩ [95┴03$%)3─5$╚$┼.╚$╒/4─6@1$5404┼,
═╚$)%3$]7#2╩@;&1┘╚",─.# -*╩!╙='╞@8╟5╞9╞5╥╚#═╨4─5354╒!0─╤9╚%1(
═25.@5╘┼,3*!"1:!!╚$╤)5%1,10╘╩╚&-╠8┌"@.╘╒/4─6@149&24-)14┘4+@╘╩
═.╞5╓96┌@861├╚&)╒9╞9┼<┬╠╤#2╩@<╫1┴╚&)╒9╞9┼<┬╠╤#2╩@;&1┴╚&=╠;╓)╪
═;6%╪#2╩@<╓5├#2╩@<╓)├╚&=╠;╓)╪;6┼╬#2╩@=&%╪#2╩@:6┘╪#2╩@;&1┘╚&=╠
═;╓)┘;6%╪#2╩@8╞5╤╚#╔╥97-┼= ╘╩.╟┼┴>:!╠9&&@(╥0╨, ╘╩╚&╤─>:!╟;&]┬
═>6╒┴> ╘╩.╞)╠86┬@<╫1┴╚"┴┬=69╞97(╔+'─-*╩!─97─-*╩!├<'╞@9╓╤╧8╟┼═
═:6╪-*╩!┬8╫.@.╞)╠86@-*╩!╠9&&@8╟5╞9╞5╥#2╩@96]╥╚",─.# -*╩!╙=&&@
═8╟5╞9╞5╥#2╩@8╞┘┼╚#╔╫:&]╨964-*╩!╔;╞.@8╟5╞9╞5╥*╙$-*├╔╫:&]╨966@
═9&5╪#2╩@8╞┘┼╚#╔┘87─-*├╔╥97-┼=*!╠9&&@(╙"@.╓┘%142@5$^@4─53152@
═5$┴%4╘6@1╒594╨╘╩╚'-╘8:!╟;&]┬>&╒┴> ╘╩╚'-╘8:!╟;&]┬>6╒┴> ╘╩╚&╤─
═8: ├)&9╞#2╩@<╫1┴╚&=╠;╓)╪;6┼╬#2╩@<╫1┴╚&=╠;╓)┘;6┼╬#0╘╩*┬╚╩╚&┘%
═6%0╠╚%)%042@04┘$╚$1205>@4$],64=/3┼,-#7)┼861─<╞%╫(&╤─>2 ├,# -
═('-╘>2!╔;╞1┼> ╒╧8╞╔╠;╓]╨(&╤─>2!╔;╞1┼> ╘@;&1┴('!╧;'┼╠:7-╘+'─@
═.╓9)4┼-4+*!42$6@3┼5-0─52╚$]&╚%!/24┘44╨╘@8╞┘┼(#╔├;╓┘╘(#═┬552@
═24:@3┼5-4$])3┼13╚$┼3╚%╔%4─^@5$┴%3@╘@:╞╒╨(&]┬:╞1╧;╞4@.╒=%╚$%2
═1:!!5*!42$6@14┘$╚$]&╚%1(1:!,25-4#3╔├;╓┘╘('-╘82!├;╫5╬='!╘<╨╘@
═:6┘├(&┼╬9&5╪#0╘╩╚')/5$%41:!04─]*14-4╚$%.1*!$4─%7╚%1(1:!03╘╤9
═1╘].#2╩@;4%+1:!355)%╚$)51─9%4╩!"14┼.1┌!$4─%73╩!43┌!)4┌!#3$5!
═4┬$-#3╔─;╓┼╘(&╔╙<┬!╥;╫1╨<╞]╩#0╘╩╚&-/3┼9%4┼2@6$╒)3╩!!3─2@6$╒!
═6*!43┌!#3╘╤534┘3#0╘@;&1┴(&╤╧8╫┴═:6╪-(&╤╙<@╘@;'-╥#2!╠<╫(@(#═8
═╚$╒/1* ╪#2!╙=&$@;&]├>&╒╔;@╘@8╓╒╨(&=╠;╓)╪;6┼╬#2!┬8╫,@.╞┘┴: ╘@
═<╫1┴(&=╠;╓)╪;6┼╬#3╔╬86@@;&1┴(&╤╧8╫┼═:6╪-(&-═<"!╟;&]┬>6╒╔;@╘@
═8╞-╙(#╔╒:'5╚#2!╙=&$@9╓╤╧8╟┼═:6╪-.╟5╚=6@@;&1┴(&╤╧8╫┴═87@-(&╤╙
═<@╘@;'-╥#2!╠<╫(-('-╘82!╠;╓-╪;6%╪#2!├;7 @9╓╤╧8╟┴═87@-(&)├8╥ ┌
═;╞]╫87─-('-╘82!╟;&]┬>&╒┴> ╘┌;╞]╫87─@;&1┴(&╤╧8╫┼═87@-(&-═<"!╟
═;&]┬>6╒┴> ╘@8╞-├(&5╧<╞9╔;&╨-('-╘82!╟;&]┬>6╒┴> ╘-*╩!╔1╩!54╘┼.
═1┌!42$6@96]╥+4)51─9%4┬╥@0╘]06:!)3┼1/╚$1205=)3─>@0┼5&1─52#2╩@
═84┘$╚%1(14┌@0╘╤%05*@5$┴%╚&5╧<┬╒"549&15(-#65╧<╞9╔;&╨@;&1┴(&9╔
═;&╨-(&)┼<2!╧8╞╔╠;╓]╨#0╘@/├╪^('-┼=&)╒9@╘@;&1┴(",\96]╥8╟5╞#2!╙
═=&$@=&5═<#$-(&╤─82 ├/╞5╧<╞)╒9@╘@<╫1┴('1┼;7 ╤*╙$-#2!╠9&$@;&]├
═>&╒╔;┬ [;&]├>&╒╔;╩!.3╒>@0╘].5$%)3┼.@0╘],54╒.#2!╠<╫(@(#═┼04-(
═╚$-/3%5-3╩!)4┌ ╤,├┬@0┼┼415,-(&)├8╥ ┌979┼;┬ [<╘^@5$┴%4─6@34┼'
═2%2@0─6@0:!#05)260╘@;&1┘(",─.# -('-╘>2!┬=69╞97(-('-╘>2!╘96╒╨
═,0╘@8╓╤├#3╔┼=╞5╬('-╘82!╘,@╘@861├(&)╒9╞9┼<┬╠╤#2!╙=&$@8╟5╞9╞5╥
═*╙$@.╓5!0╘┬@0╘],54╒.╚$┼3╚#$╥.*!"651%4╨╘@;&1┴('0╥#2!┴9&,@=&5═
═<#$╦,2 [;─]7╚%=%╚%=)3$╥@4╒1!4┼2@052@5$┴%#2!╙=&$@=&5═<#$╦,2 [
═0╘],54╒.#0╘@;&1┴(&╤╧8╫┴═87@-('-┼8╨╘@<╓)├(&╤╧8╫┴═:6╪-('1┴>" [
═=$]404╥@3┼5-0─52╚$]&╚$-/3%5-3┼.@5$^@1$\-(&┼╬>" @.╘4╬1╥┌@1─┼,
═3*!#3╘╤534┘3╚#$╬+├,-(&╤─>2!╠;╓-┘;6%╪#2!┬;╞4@.╞9╧;╫ -(&┼╬8╥!╠
═;╓-┘;6%╪#3╔╞;╓]╨(&╤─>2!╠;╓-┘;6%╪#2!╠9&$@(╙ ╨#3╔╟;╓]╨(&5╧<┬ ╚
═=&5═<#$╔+'─@.╓5╧<┬╒"549&15(-('!╚80╘╩╚&╒!64)%╚%!55*!!3╩!┼;╫*@
═0─5,3╒<_#2!┼;╫(@*&)╒9╞9┼<┬─╠>0╘@<╫1┴("┴┬=69╞97(╔+'─-(&╤─82 ├
═,# @.╓╒)1╘┴4╚$%3╚%=%3$╥@0╘╤%05*@252@3─]7#2!╙=&$@*'1┼;7 ╤*2╤┘
═#2!╨;&$-(&1┼>0╘@8╫!┘(&╤╧8╫┼═:6╪-(&)├<╥ ┌9╓]╧< ╘@;&1┴(&)╒9╞9┼
═<@╘@96]╥(",─.# -('-╘82!┬=69╞97(-('-╘82!╘96╒╨,0╘@8╞┘┼(#╔┬;╓]╨
═#2!╔;╞,@8╟5╞9╞5╥*╙$-(&┼╬8╥!╘96╒╨,2╠╤#3╔┬;╓]╨(&1┼> ╘@8╞┘┼(#╔╞
═;╓]╨#2!╩;7 @;╓)╩;&]╧< ╘-;╓)╩9&]╬90╘╩*┬╚╩╚'-705"@0┼5&1─524╨╘-
═<╫=┴<&)╒9┬!╠9&$@=╞╒├<╓(-(&5╧<┬ ├)# ╥(#═╨4─545%╞@5%))0╘═9+*!%
═2#\-('-╘82!╓;6-╙8@╘@;&1┴(",─,#@-(&5╧<┬!┌=&5═<" [6┼1%35 ]2$┼'
═2*!"651%╚$╔54╒2@1─╤)4%,-('-╘82!┌=&5═<" [0─545╘5%3╩ ─,╙"@04┘$
═╚"0╙. ╘-(&╔═<"!═86┼╬(#═┴4─]53─2@04┘$╚$%23╒5.1*!71:!'3╥╪╬+@╘-
═('1╪=" ╟9╘5%╚&)204┼.+*!72$%4╚$1/╚%┼/5:!704┘4╚%1/╚$1/╚"<-('1╪
═=" ╟5$].24=(5#\╟#0╘╩*╩!╥3╒1!5$4╠╚%!23╘╔%0╒0╠╚$%.1*!35$]21:!4
═2$6@4$])3┼13#2╚-*╩!╘2$┼3╚%!!4┼2@25.@0:!324=.249)0╘%.5*!#2$%.
═1╘6@4╘┼.0╘4-*╩!6,┬╪╨+╩"@;─]7╚$┼4╚$┼3╚$&@0╘]-4$╤%5$5,6:!'14┘%
═4─%,╚%!/3%┼'3╘┌@4$╤/5%1%4┬╪-*╩!┴╚%-%5*!/1╩!03╘┼.5%.@25.@4─5!
═1*!)3┬╥@4─]4051%1*!!3─2@4%)/2─5#5$5$+*!!3─0-*╩!03$]45$5$╚$┼.
═5$^@5$┴%╚$1205=)3─>@0┼5&1─52╚"┴┼;╫*@3╒*@3─]234%,*2╪-#7)╧='!╥
═;╓╚-#2╩@8:!.14%4╚$╒!0╒)/#6┘┼9╥!═86,@(#═├2$%.1╘6@5$┴%╚%-)1╘┌@
═3╘:@0:!45╘\╟4┌!#3╘╒03$5-14┘4#2!├;&,-(&╤─82!=,2 [3┼5-0─52+@╘@
═96]╥(",─9╞8-(&%─8╥ ├)# ╤#2 \/#╨-#2╚═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═
═+2╘═+2╘═+2╘═+2╘═#2╩@=$┴%4╘6@34%#4─]3╚%)%4$╤!0╘6@5$┴%╚%!2159)
═3╒53╚%!23╘╔%0╒1)3╘╪-*╩!354)23╒5424┘%+@╘-<╓╒╒;'2@;6%├╚#══54╤4
═25!,6:!45╘^@4╘┼'3─5$╚#@═0─┼4#2 [3┼5-0─524╙╩@82╔┘+╙8╘╚"╘^╚&$-
═('-╘8:!┌,╨╘@8╓╤├╚* [=$┴)4┌!-54╤425!,6:!)4┌!&3╒*@3─]234%,#2!┼
═;╫*@(╥1╞9╩ [3┼5-0─524╥╥@22┘%+╩!8/2╘╓-"╪╬-├0-(&%─8┌ ├)# ╤#2!╙
═=&&@>├0-(&╤─8: ╚>├,╔+'─-('-┼8╨╘@<╓)├╚"┴┌-"─╠>0╘@/#╨\╚* [84╤,
═╚$1/3─6@.┬─-#7-═=6╤╘>┬!═86,@.╓╒53%1)4$╤9╚%173┌!324=.142@."╒"
═250-(" @.╘┘534)%4┼,┌╚&$╩>2\╓-* ═/╩!┴#2!╙=&$@>├$-(&-╠8╥ @.╓%.
═1*!42$┼3╚$╒53%1)4$╤9╚$┼3╚%-014-)1─┼#04╤,60╘@96]╥(",─9╞8@.╘9/
═4╩!42$6@4%)/2─5#5$┼/3╩!005)4+*!72$5210╘@861├(",─,#$@.╘┘534)%
═4┼.@05)%╚"╘╤,3 ╬+├$╤,*!!3─2@,"╪╬-# -('-╘82!┌,@╘@;&1┴("┴┌,2─╠
═>0╘@<╓5├#2!╙8╞,@*'╚╥*2╤┘#2 \/#╨@(#═┴3$╥@1$].1: ┌*0╘-<')╧:╞5├
═="!═86,@(#═╘2$6@04-454%,╚%!23╘╔%0╒1)3╘┌@4─]55$┼.10╘[=$┴%╚%)/
═551)3─6@5$%+15.@5$┴%╚%!/24┘4#3═=,:!=,╩!=,╥╥@4─]4051%4┌!!3─0-
═.╒!23╘╔%0╒13╚$┼4+*!!3─2@4╒1/4─53╚%1(10╘[4─5354╤4╚$┼.╚%╘╤╚%╘╥
═╚%╘╙+@╘-(&╤─>2!=,2 [;55,5$┼03%╞@1─┼24╒2@4─]4051)3╘┌@0╘],54╒.
═#2!╠9&$@83$╤#2 ^/├╪@<╓╒╒;'0-('-╘82!╨,70-(&╤─82!─,├$-(#╪^/┬!╙
═;75╠= ╘@<╫1┴(' ╥= ╘@;&1┴(&<╙,0╘@/├╪^('-═=6╤╘#2!╙=&$@<#-╘#2!╠
═9'─@73(@.╫-%0╘].1*!#3╘╤534╪-(&╤─82!┬,3(-(#╪^/┬!╙;75╠= ╘@8╓╤├
═#2!┴9&,@<#%╘#2!╙=&$@<#%╘#2!╠9&$@93(╥#2 ^/├╪@<╓╒╒;'0-(&-╠8╨╘@
═861├(' ╥= ╘@<╫1┴(' ╥= ╘@;&1┴(&@╙,@╘@/├╪^('-═=6╤╘#2!├;&,-(&%─
═8╥!╨,╫0-('-╘82!╨,╫0-(&╤─>2!=,╥ [=$┴)4─2@0╘],54╒.#2!╠9&$@8╙$╙
═#2 ^/├╪@<╓╒╒;'0-(&-╠8╨╘@861├(' ╤= ╘@<╫1┴(' ╤= ╘@;&1┴(&8╥,╨╘@
═/├╪^('-═=6╤╘#2!├;&,-(&%─8╥!╨,╟0-('-╘82!╨,╟0-(&╤─82!╔,╙,-(#╪^
═/┬!╙;75╠= ╘@8╓╤├#2!┴9&,@<#-╘#2!╙=&$@73,@.╫)/5$%4142@>@╘@=&%╪
═#2!╠9'─@>╞1╔=┬╤╪(#═╘04),1:!/1╩!$+╥┴:*╒╚╨*0╘@(" [;─]7╚'╞@0╘].
═5$%)3┼.@4%)/2─5#5$┼/3╩!#3╘┘35 ╘-(&╤─82!╨,70-(#╪^/┬!╙;75╠='╚-
═(&╤─>"!┌;╓]═#2!├<'@@(╙8╘#2!┬97$@8╓]╬='@-('-╘>2!╘96╒╨,0╘@;&1┘
═('╔╧;╓╘-(#╪^/┬!╙;75╠= ╘@;&1┘('1┼;7 ╤#6-╧;╟1╪(&-╠8╨╘@861├(",╓
═-" [;╘9&4╘54╚%1(1:!#3╘]21$┼.051%#2!╙=&$@73$@.╫)/5$%4142@04┘$
═╚%!23╘╔%0╒1%1 ╘@8╓╒╨(&╤╧8╫┴═:6╪@.╫-%1:!)1╩!)5*!)4┌!!╚$╤/0╘%,
═╚$╒)3─┼-54╘-(&)├<╥!╬;╫1╪;6┼╬#2!╙=&$@;&]├>&╒╔;@╒╬;╫1╪;6┼╬(&-═
═<"!╠;╓-╪;6%╪#2!┬8╓,@;╞]╘>&╒┴> ╘@<╫1┴(&╤╧8╫┴═87@-#6┘╧='┴═87@@
═;&1┴(' ╥= ╘@/├╪^('-═=6╤╘>@╘@8╫!╪(",╓- ╘@8╞5╤(&-╧;╟1┘#2!╠9'─@
═>╞]╧;0╘@/├╪^('-═=6╤╘#6-╧;╟1┘(&-╠8╨╘@861├(",╓- ╘@<╫1┴(%╘╥(#═╥
═3╒1!5$5$╚$%.1*!04─]*14-4142@>0╘@8╓╒╨(&╤╧8╫┼═:6╪-(&)├<╥!╬;╫1┘
═;6┼╬#2!╙=&$@;&]├>6╒╔;@╒╬;╫1┘;6┼╬(&-═<"!╠;╓-┘;6%╪#2!┬8╓,@;╞]╘
═>6╒┴> ╘@<╫1┴(&╤╧8╫┼═87@-#6┘╧='┼═87@@/#╨\(" [84╤,╚$1/3─4-#2╩@
═;&1┴╚",\96]╥8╟5╞╚#═╞25)35*!71:!.145$╚%1/╚$-,14%2╚%1(10╘╩╚'-╘
═8:!┬=69╞97*@.╓5╧<╩!"549&15(-*╩!╠9&&@(╙┘┼;╫)┬=68-*╩!╙=&&@8╟5╞
═9╞5╥*╙$-#2!╠9&$@(╙ @.╫)%4╘54╚'┼-24┌@04┘$╚'┼-05@-('-╘82!╠;╓-┘
═;6%╪#2!╙=&$@;&]├>&╒┴> ╘@;&1┴(",─9╞8-('-╘82!╠;╓-┘;6┼╬#2!╙=&$@
═;&]├>&╒╔;@╘-<╞5┴9'!╘<╥!╠9'─@:6┘─97@-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙
═=&$@<#%╪#2!╔;╟─-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#%┘#2!╔;╟─-(&╤─
═82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#%┌#2!╔;╟─-(&1┼8╥!├;╫5╬='!╘<╨╘@;&1┴
═('!╧;'┼╠:7-╘+'─-('-╘82!╨,╟@-(&┼╬>0╘@;&1┴('!╧;'┼╠:7-╘+'─-('-╘
═82!╨,╟─-(&┼╬>0╘@;&1┴('!╧;'┼╠:7-╘+'─-('-╘82!╨,╟╚-(&┼╬>0╘@9&5├
═(&-╧=6┘╘<'1╙#2!╠9&$@<&]╠>6╤╔<╫0╠>0╘@<╫1┴(' ╙> ╘@:6┘┘#2!╠9&$@
═<&]╠>6╤╔<╫0╠>0╘@<╫1┴(' ╙>0╘@:6┘┘#2!╠9&$@<&]╠>6╤╔<╫0╠>0╘@<╫1┴
═(' ╙>@╘@:6┘┘#2!╙='─@:6┘─97@-(#╪^/┬!╨<╞]╩96-╘+' ╤>#═╨,7─[<#%┌
═#2 ^/├╪@<')╧:╞5├="╤╨,╟@[<#)┘.╫ ╥>@╘@/├╪^('!╥;╓╔┼8╫0╠<#-╪.╫ ╙
═>3═╨,╫╚-#2!╠9&$@:&┼─90╘@8╞5╤(#╔─;╓┼╘#2!╠9&$@<#)╪(#═╚241$14┌@
═1─%#1:!#2$5#2╨╘@<╓5├#2!╙8╞,@<#%╪#2!╘87─@(#═┘/2┴8,┬╒8,2─-(&╤─
═82!╨,╫─-('-┼8╨╘@<╓)├(' ╥>2 [83╘╚63,═63(╔#2 ^/├╪@<╓╒╒;'0-('-╘
═82!╘96╒╨,0╘@;&1┴(' ╙> ╘@<╓5├#2!╙8╞,@<#)╪#2!╘87─-(&╤─82!╨,╟─-
═('-┼8╨╘@<╓)├(' ╤>0╘@/├╪^('-═=6╤╘#2!├;7 @=&5═<#$@.╓┼&╚%@╤*┼─╥
═+5─╤*┼@╥╚#┌@,*!42$5.╚$9!0╘4-(&)═:2 ┌9&]╔=" [25.@5─┼324),10╘@
═9&5├(&-╧=6┘╘<'1╙(#═╧5$┴%4┼=)4╘6@4─5!1*!)3╩!214╒!24┘)3─<-(&)┼
═<2 ┌86)╧<╟0@.╒!/24┘44┌!!3─2@4─5455).#3╔╨;╓]╨(&┼╬8╥!╔;╞1┼> ╘@
═:6┘├(&┼╬9&5╪#2!╔;╞,@:6┘─97@-(&1┼8╥!├;╫5╬='!╘<╨╘@8╞┘┼(#╔╨;╓]╨
═#3╔┴8╞]╥="!╥=',-#3╔─;╓┼╘(&╤─82!╨,7@-('-╘82!╪,0╘@;&1┴(' ╤>0╘@
═<╫1┴('─╤#2!╠9&$@<#)╪#2!╙=&$@>#(-(&╤─82!╨,╟─-('-╘82!┘,@╘@:╟-╥
═(&1╥87<-(&╤─82!╨,╟@-('-╘82!╪,0╘@;&1┴(' ╥>0╘@<╫1┴('─╤#2!╠9&$@
═<#-╪#2!╙=&$@>#(-(&╤─82!╨,╫─-('-╘82!┘,@╘@:╟-╥(&1╥87<-#2!─96,@
═8╓]╒;╟1╨=',-(&)╬92!╨;╓╤┘;&]╧<" [:5.@252@2┼535*!!╚%1224%.1╘╤%
═/╨╘@:╞╒╨('!╧;'┼─;╓┘┼#0╒╨;╓╤┘;&]╧<"!╠9'─@:6┘─97@-(&╤─82!╨;╓╤┘
═;&┼╙="╤┘#2!╙=&$@<#)╪#2!╔;╟─-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#)┘
═#2!╔;╟─-(&╤─82!╨;╓╤┘;&┼╙="╤┘#2!╙=&$@<#)┌#2!╔;╟─-('-╘>2!╔;╞1┼
═> ╘@/├╪^('!╥;╓╔┼8╫0╠<#)╪.╫ ╥>3═╨,╟╚-#2!╠9&$@<#)╪#2!╙=&$@>#$-
═(&╤─82!╨,╟─-('-╘82!┘,0╘@;&1┴(' ╙> ╘@<╫1┴('@╥#2!╠9&$@<#-┘#2!╙
═=&$@>3(-(&╔╙<┬!─<╞%╫#0╘@;&1┴(' ╥> ╘@<╫1┴(' ╙> ╘@;&1┴(' ╥>0╘@
═<╫1┴(' ╙>0╘@9&5├(&-╧=6┘╘<'1╙#2!┬97$@<&]╠>61╧;╞4-(&╔═<"!╨;╓╤┘
═;&]╧< ╒╨;╓╤┘9&]╬92!╠9&$@<#%╪(#═├3$]31:!42$6@4$],64=/3@╘@<╫1┴
═('@╥#2!╠9&$@<#%┘#2!╙=&$@>3(-(&╤─82!╨,╫@-('-╘82!╪,0╘@;&1┴(' ╙
═>0╘@<╫1┴('─╤#2!╩<╫(@9')┴=╨╘@<╟1╙#0╘@='┴╘("=╙04╒%╚%1(24┘'╚%=%
═╚$1/╚$5615)9╚$┘)1╘┴4+*!╨24┘+63╩@)╨╘@='┴╘("=44┼╞@5$^@5$%+1:!/
═5─52╚%1(1:!73╒),1"$╟#0╘-*┬╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═
═+2╘═+2╘-*╩!╟14┘%4─%,╚%%515-424].04),12╒604╤51:!%4┼)/4╩!04─]#
═14154─4-#2╔├:&]╦9:!╠9'┬@(╙ ╨#2╚┌;&]╧<*!╠9&&@.╞-╘97┴╘+'@-*╩!┬
═97&@.╞1╧;╞4-*╩!╩<╫*@8╓┴╥;╫5╘#2╩@:6┘╪#2╩@:╞╒╨╚#╔╠;╓]╨#2╚┌9&]╬
═9:!╥=',-*├╔├=&5╪=*!╚97┬@,&2@.╓-╥#2╩@='┴╘╚"=33╘╒%5$┴)3─>@0╘┴/
═2╘5$╚#╚╚)╨╘╩╚&┴┼>* ╨9# ╨#2╚-('1╪=" ╟;─%21┬$╟#0╘╩+2╘═+2╘═+2╘═
═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+0╘╩╚&1205=)3┬>@0:!,24┘%+╩"@8:!&
═04┴.╚$╤!2$╪╬#0╘╩*┬╩@<╘]-1:!54╘5&54╥@34%#4─]3#0╒├:6┘╔="!═86,@
═(#══04-23┌!43┌!)3─┼424%,25╔%╚%1(1:!#3╒5.5$52#2!╠9&$@73$@.╘18
═╚$]2╚$19#2!╠<╫(-(#╨\/" @.╫1(1:!$6"\╥╚$╒!2╘53╚$&@3─┼#15*@3$]/
═2╘┼.1┌!,24┘%#0╘╩*┬╚╩*╩!═04-23┌!43┌!404═%╚$&@4╒1%4*!)3╩!╪#0╒╪
═<╫1┼<"!═86,-(&╤─>"!─>" [;┼5-0─52╚$]&╚$╤/3╒"@251%4─%424].4╨╘@
═/├╪^(&-╔;╞┼╘+&1╪#7┴╠;╓]╨(&╤╙<┬!├:'5╬:╨╘@8╞5╤(&9╔>&,@.╫501$%4
═1:!#3╘╤534╪-('-┬8╥!─>0╘@8╞-├(&9╔>'─@.╫1)346@5$^@4╒1%4*!)3╩!┘
═#2!─97@-(&)╬92!╪;&]╧< ╒─;╓┘┼(&╤─82!╧;&1╪(#═╨3$]4╚%1(1:!,05-4
═╚$-(54┘+#2!┼;╫(@8╓┴╒;╞╠-(&]╥82 ╚8╟5╞9╞5╥*2╤┘#2!╙=&$@*&)╒9╞9┼
═<┬─╠>0╘@<╟1╙#0╒╞:7┴├('!╚80╘@;&1┴(&]╠9'@-(&]╥82 ╚8╟5╞9╞5╥*2╤┘
═(#═╨3$]4#2!╙=&$@*&)╒9╞9┼<┬─╠>0╘@;&1┴(",─9╞8@.╫501$%41:!#2%5.
═2╨╘@<╫1┴(&]╠9'@-('-╘82!├:'5╬:╨╘@;&1┴(",─.# @.╓┼.0╒)%05-%╚%1(
═1:!#3╘╤534╪-(&5╧<┬!┬=69╞97(-('-╘82!┬=69╞97(-(&)╬92!├,@╘@:6┘├
═(&)╒9╞9┼<┬╠╤#6,╥#2!╨;&$-('-┬8╥!─>0╘@8╞-╙(&-╧;╟0-(&%─8╥!─> ╘@
═:68@:2╤=,2 [9$^@5╘6@55-%╚&┼╬>:!/4╩!─97─_#2!╔;╟─-(&5╠<╓4-(&1┼
═>0╘@9╞┼╬#6-╧;╟0@9&5╪#2!┬;╞4@>&╤╧;╫ -(&╔═<"!─;╓┘┼#0╒╞:7┴┘(&%─
═8╥!─> ╘@<&┴┴#2!╠9&$@;╓╤─> ╘@96]╥(&-╚=6┘╦#2!╧<╞$@*&)╒9╞9┼<┬─╠
═>0╘@<╫1┴("┴┬=69╞97(╔+'─-(&╤─82!├:'5╬:╨╘@<╫1┴(&]╠9'@-('!╠80╘@
═:68@:2╤=,2 [=5!$051%╚'─-(&┼╬>0╘@96╤╙90╘@9&5┘#2!╞:6╪-(&1┼> ╘@
═8╞┘┼('┴╠;╓]╨#2!╥=',-(#╨\/" @.╓5.1*!/1╩!═04-23┌!84╒1%4 ╘-*┬╚╩
═*┬╩@=$%+1:!!╚%-415"@24┌@>0╘->7-╘97 @;6%├#2!╠9'@@9'─@.╓┘534)%
═4╩!/1╩!,3╘]0╚$┼415)!5$┼/3┼,-(&)┼<2!─;╓┘┼(#═╔1╩!$63╘╨╚$┼4)╒.@
═2┼535*!!╚%!/24┘4#2 ^/├╪@8╓┼╬:70╠9'─-('-┼8╨╒┘;&]╧<"!╨:&$-(&╤─
═82!╧;&1╪#2!╧<╞$@*&)╒9╞9┼<┬─╠>0╘@<╫1┴("┴┬=69╞97(╔+'─-('!╠80╘@
═:68@:2╤=,0╘@:6┘┘#2!┼;'-┼#2!─97─-(&9╔;@╘@<╓)├(&1╪#2!┬8╓,@9╞┼╪
═> ╘@9&5╪#2!┬;╞4@>6╤╧;╫ -9&]╬92!╠9&$@;╓╤─> ╘@;╫)┴("┴┬=69╞97(╔
═+'─-('-╘82 ╚8╟5╞9╞5╥*2╤┘#2!╥=',-#69╔>'@@861├(&1┘#2!╠<╫(@;╓╤─
═> ╘@<╓5├(" [:4╒03╒)404┘4(0╘@8╞5╤(&9╔>&,-(&1┼> ╘@8╞┘┼('┼╠;╓]╨
═#2!╩;7 @9&]╬90╘-9╞┼╪8╥!╨:&$-(&╤─82 ├)#@╨#2!╙=&$@;╓╤─> ╘@96]╥
═(&)╒9╞9┼<@╘@<╫1┴(&)╒9╞9┼<@╘@8╞┘┼(&,╥#2!╔;╞,@8╟5╞9╞5╥*╙$-8╙(@
═<&╤┴#2!─97@-(&)╬92!┘;&]╧< ╘@:╞╒╨(&1╧;╞4-(#╨\/" @.╓5.1*!/1╩!═
═04-23┌!94╒1%4 ╘-*╩!╘04═%╚$%.╚%┬@4╒1%4*!)3╩!42$6@96]╥╚$)51─9%
═4@╘╩╚'1(1:!33╘╤%╚$-(04┘'1:!)4┌!43┌!54╘6@96]╥╚$┼.4╒1%042@3╘:@
═;╫)┴#0╒┼;╫)╪<╫1┼<"!═86,-(&╤─>"!─>" [;┼5-0─52╚$]&╚$╤/3╒"@251%
═4─%424].4╨╘@/├╪^(&-╔;╞┼╘+&1╪#7┴╠;╓]╨(&╤╙<┬!├:'5╬:╨╘@8╞5╤(&9╔
═>&,@.╫501$%41:!#3╘╤534╪-('-┬8╥!─>0╘@8╞-├(&9╔>'─@.╫1)346@5$^@
═4╒1%4*!)3╩!┘#2!─97@-(&)╬92!╪;&]╧< ╒─;╓┘┼(&╤─82!╧;&1╪(#═╨3$]4
═╚%1(1:!,05-4╚$-(54┘+#2!┼;╫(@8╓┴╒;╞╠-(&5╧<┬ ╚8╟5╞9╞5╥*2╤┘#2!╙
═=&$@*&)╒9╞9┼<┬─╠>0╘@<╟1╙#0╒╞:7┴├('!╚80╘@;&1┴(&]╠9'@-(&5╧<┬ ╚
═8╟5╞9╞5╥*2╤┘(#═╨3$]4#2!╙=&$@*&)╒9╞9┼<┬─╠>0╘@;&1┴(",─9╞8@.╫50
═1$%41:!#2%5.2╨╘@<╫1┴(&]╠9'@-('-╘82!├:'5╬:╨╘@;&1┴(",─.# @.╓┼.
═0╒)%05-%╚%1(1:!#3╘╤534╪-(&5╧<┬!┬=69╞97(-('-╘82!┬=69╞97(-(&)╬
═92!├,@╘@:6┘├(&)╒9╞9┼<┬╠╤#6,╥#2!╨;&$-('-┬8╥!─>0╘@8╞-╙(&-╧;╟0-
═(&%─8╥!─> ╘@:68@:2╤=,2 [9$^@5╘6@55-%╚&┼╬>:!/4╩!─97─_#2!╔;╟─-
═(&5╠<╓4-(&1┼>0╘@9╞┼╬#6-╧;╟0@9&5╪#2!┬;╞4@>&╤╧;╫ -(&╔═<"!─;╓┘┼
═#0╒╞:7┴┘(&%─8╥!─> ╘@<&┴┴#2!╠9&$@;╓╤─> ╘@96]╥(&-╚=6┘╦#2!┼;╫(@
═*&)╒9╞9┼<┬─╠>0╘@<╫1┴("┴┬=69╞97(╔+'─-(&╤─82!├:'5╬:╨╘@<╫1┴(&]╠
═9'@-('!╠80╘@:68@:2╤=,2 [=5!$051%╚'─-(&┼╬>0╘@96╤╙90╘@9&5┘#2!╞
═:6╪-(&1┼> ╘@8╞┘┼('┴╠;╓]╨#2!╥=',-(#╨\/" @.╓5.1*!/1╩!═04-23┌!8
═4╒1%4 ╘-#2╩@=$%+1:!!╚%─═4╒1%4*!)3╩!42$6@96]╥+4)51─9%4@╘╩╚&-(
═04┘'15.@1┼)/3:!!0─]61:!!4─4┌╚$].3%╞@4$╤/5*!,05-4╚%!!4┼2@3╘:@
═14%#2 ╘╩╚%9%4┼1)0╘%,╚$-(54┘++*!$3╘╪╟5*!03$]4╚$╤!4╒2@4$])3┼0╠
═╚%!,3╒2@5╘┼42*!┼;╫(-#65╧<╟┼╙=&5╨(&╒┴8╨╘@;&1╪(&1┘(#═╬54╒"15*@
═3╘:@3$]/4*!)5$52051)3╘┘3#2!┬97$@9&]╬92 [:4:@1%─],*!)5"=3╚$╔5
═4╒2@0:!03╘┼.5 ╘@/├╪^(&-╔;╞┼╘+&1┘#2!╙96,-*╟┼╠;╓]╨╚'!╚80╘╩╚&╤─
═8:!╧;&1╪#2╩@;╫)┴╚"┴┬=69╞97(╔+'─-*╩!╙=&&@*&)╒9╞9┼<┬─╠>0╘╩╚'!╠
═80╒┘;&]╧<"!╔9┬!╔+%╘╤#2!╔;╟─-(&5╠<╓4-(&1┼>0╘@9╞┼╬#2!╙8╞,@9'@-
═(&)├8╥!╞:7┴╪#2!─97@-(&)╬92!┘;&]╧< ╘╩9&]╬9:!╠9&&@;╓╤─> ╘╩╚&]╥
═8: ╚8╟5╞9╞5╥*2╤┘#2╩@<╫1┴╚"┴┬=69╞97(╔+'─-9&]╬92!╥=',-#69╔>'@@
═861├(&1┘#2!╨:&$@(#═╫1:!/3─╤9╚%!,3╒2@5$┴%╚$╤!4╒2@4$%25*!/1╩!%
═04-(╚$-(54┘+#2!╠9&$@;╓╤─> ╘@96]╥("┴┬=69╞97(╔+'─-('-╘82 ╚8╟5╞
═9╞5╥*2╤┘#2!╨;&$-(&╤╙<┬!╧;&1╪#2!╙96,@(#═╔35!/4┼1!3┼0┴#2!┬97$@
═9╞┼╪8╨╘@9&5╪#2!┬;╞4@>6╤╧;╫ -(&╔═<"!─;╓┘┼#0╒╞:7┴├('!╚80╘@;&1┴
═(",─.# -('-╘82!╧;&1╪#2!┼;╫(@8╟5╞9╞5╥#2!╙=&$@8╟5╞9╞5╥#2!┬;╞4@
═8╙(-(&┼╬8╥!┬=69╞97(╦,0╒├,┬!╨;&$-(&1┼> ╘@8╞┘┼('┼╠;╓]╨#2!╩;7 @
═9&]╬90╘@/#╨\(" [94┘$╚$]&╚&╒!0╒)/╚%┼35$50#2╚╩*┬╩@:4┘)5$┼!3*!,
═24┘%╚%-%5%50#0╘╩*╩!╘2$6@0╘]-345.5$5$╚$╤)3─53╚$)%3$]7╚$%21:!.
═3╒>@5$%+14┌@0╘%21:!/1╩!"6:!42$4-*┬╩@0╘%,3$┼.1┌!23╒5424┘%+@╘╩
═9')┴=┌ ^/├┌@;6]╓92╤╘>#$[>#&@╚#══3╒9%╚%-4549&╚$┼.5$^@6─523┌!0
═04=%#2╩@/├╪^╚&╒╧=╞4╠='@╥.╫@╥╚* [=╘┴%4─6@252@0╘%.╚$)%╚$╒/1$┼&
═245$#2╩@/├╪^╚&╒╧=╞4╠='─╤.╫─╤#2╩@/├╪^╚&╒╧=╞4╠='─╥.╫─╥#0╒─<╞%╫
═(&╤─82!╞:6╤╠#2!┬;╞4@.╟-┼=&5╧<@╘@/├╪^('-┼=&)╒9@╘@:╞╒╨(#╔╙971╒
═< ╘┌<╓5╘96]╥(&╤─82 ├/&5╧<╞)╒9┬ [=5-%╚&5╧<╩!"549&15*@24┘35$5!
═1*!/1@╘@<╫1┴(&)╒9╞9┼<┬ [1$┼34$╤!6:!"549&15*@1─]2╚$1205=)3─<-
═(&╤─82 ├/╞5╧<╞)╒9@╘@<╫1┴(&)╒9╞9┼<┬╠╤#0╘┌<╓5╘=7 @<╓5├(" [;4%+
═1:!355)%╚%@╤/%@╥#2!╠9&$@>#(-('-┬8╥!╪,0╘@8╞-╙(#╔├;╓┘╘#2!╠9&$@
═>3(@.╓┼&╚$┘/5"╥@4╒=!4*!╨,:!!3─2@<#(-(&╤─>2!┘,0╘@<╫1┴('─╤#2!╙
═='─@>3(-(&╤─82!╪,0╘@;&1┘('@╥#2!╙='─@>#$-('-╘82!╪,@╘-('-┼8╨╘@
═<╓)├('@╤(#═╬3╒>@83╒$6 ╘┌8╓]╬="!╙=&$@9'@-(&╤─>"!╪,2 [<%54╚%@╤
═╚$┼.5$^@>"╥@3─]7╚%=%╚$-!3╩!44─%32*!╪,0╘-8╓]╠=6╒╬('1╪82 [9─┼.
═1*!42$6@1─┼24╒2@0╘],54╒.╚$9/4╩!╪#2!╠<╫(-(&╤╙<┬ @.╫1(15)%╚$%2
═1:!8,2\╪╚#$╥.*!"651%╚$),3╘-+4╨╘@;'-╥(" [=╘┴)0╘┬@345!3┼.@6#$╧
═,3:@,├4╓╚$)95$6@0─╤/0╘═3#2!╠<╫(-(&)├8╥ ┌979┼;┬ [=╘┼42*!!╚%!/
═4╒-)0─╤%╚$585%)!╚#$╥.*!"651%╚$),3╘-+#2!╠9'─@(╥0╪," [24:@4╘\╠
═╚%-%5*!42$6@2$┼'2*!"250-('-╘>2!┬=69╞97(-(&-╠8╨╘┌979┼;┬!┴9&,@
═8╟5╞9╞5╥*╙$@.╓%$1*!)3╩!42$6@3┼5-0─52╚$]&╚#(╒-╩!"651%╚$),3╘-+
═4╨╘@<╫1┴(&)╒9╞9┼<┬╠╤#0╘@<╓5├#2!╠9&$@>3(@.╓-!3$-53$%41:!$60╘@
═<╓)├('─╤#2!┬8╫,@.╞-╧;╟0╥(#═╔4┌!9,├┘9,3\-(&5╧<┬ ├)&9╞(#═╧5$┴%
═4┼=)4╘6@1%─]63$═63(-(&%─8╥ ├)# ╤#3╔├;╓┘╘,┬!╙=&$@9'─-(&-═<"!─
═>" [=╘┴/)╒.@0─┼'1╘52.╩!$6:!/4╩!$6#\-(&)├8╥!╙=&5╨:6┘╪(#═╔1╩!$
═6"╥@5$┴%3┬╪╬+@╘@:╞╒╨('-╘97!╔;╟─-#7-╘97!╔;╟@@;&1┘('─╤#2!├<'─@
═>3(-(&╤─82!┬:71╨+'@@.╫┬@0╒524─5.5$╤9╚$-/3┼1!24┘3╚%@╤#2!╙=&$@
═;╓╤─> ╘@<╫1┴(&-╚=6┘╦#2!┬8╓,@>&┼╬8╫─@.╓1/╚%=%╚%-415"@1─]25╘%2
═1%.@3╒*@0─%#2╒=!4─13╚$┼.╚'─_#2!╩;7 @>&1┼8╫─-#7┴╔;╞-┘(&╤─82!╞
═:6╤╠#2!┬97$@;╞]╥;7┴╔;╞,-(#╪^/┬!┼;╫)╪<╫1┼<"╤╔;╟─-;╞]╥;7┴╔;╞,@
═/├╪^('┴╙=&5╨+&┼╬>0╘->&1┼8╫─@;&1┴(&9╔;&╨-(&)┼<2!╬;╫)═>&1┼8╨╘@
═/├╪^(&5╧<╟┴╙=&5╨+&1┼>0╒╬;╫)═>&1┼8╥ ^/├╪@>'-╘97 ╠9&5┘#0╒╙=&5╨
═:6┘┘(&╤─>2!┘,0╘@;&1┴(&)╔=' ╠>" [>#╒8,0╘@<╫1┴(&]╠9'@-(&╤╙<┬ @
═.╫╞@1$]%4╘╪╟5*!54╘6@0╘┴53─═3#2!┼;╫(@;╓╤─>" [<╘^@5╘6@2┼535*!7
═04┘4╚%1(1:!"250-('-╘82!╧;&1╪#2!├<'─@>3(-(&)├<╥!┘9&5├>0╘->6┼╬
═8╫─@;&1┴(&9╔;&╨-(&)┼<2!╬;╫)═:6┘├#2 ^/├╪@96]╥>7-╘97 ╠:6┘┘#6┘╧
═<╞╒╔;╞,@/├╪^('┼╙=&5╨+&┼╬>0╘->61┼8╫─@;&1┴(&9╔;&╨-(&)┼<2!╬;╫)═
═9&5├#2 ^/├╪@96]╥>7-╘97 ╠9&5┘#6┘╧<╞╒─96,@/├╪^('┼╙=&5╨+&1┼>0╘-
═#2╚═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═#2╩@8╘╤%04┌@55 -
═#6-╠96%╬=7 @;&1┴('9═8╫-┬(#═╙5╘┼40╘┬@0╘┴!4╩!23╘╓@0─%#2┌!)3@╘@
═86┘─(",┼,3$╤,3 ╤,#$@.╘1%1─%53%0-('-╘82!╓;6-╙8@╘-(')╘<╥ @.╘)9
═12$-#2!╘>'0@)╒-024┘!3*!#4─%#2╘52╚"<-('1╪=" ╟4╘╤*╚#8╧.34╟#0╘╩
═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+2╘═+0╘╩╚'-%5*!54*!"252@
═5$%"3$4-#2!─<╥!>(#═├3$5!4╩!43┌!%3─2@3╘:@4$%'10╘@(" [<╘^@5$┴!
═5*!404),15.@4╒1!4┼2@3╘┌@0:!004=%╚$)/54┘$05)9#6)╔=' @;'5╨(#$╓
═(#╠╤,├┬@94┘44─┼%4┌!&3╒*@> ╘@9&9┬("4╤,3$╤,3$╤,0╘@9&9┬("4╨,3$╤
═,3$╤,0╘@9&9┬("4╨,#$╤,3$╤,0╘@9&9┬("4╨,# ╤,3$╤,0╘@9&9┬("4╨,# ╨
═,3$╤,0╘@9&9┬("4╨,# ╨,#$╤,0╘@9&9┬("4╨,# ╨,# ╤,0╘@9&9┬("4╨,# ╨
═,# ╨,0╘@+2╒>#0╒╙:6╪@.╫1!0─╤%╚$]&╚%-)3─53+* ╤,├"@0┼┼415,-8╓]╙
═(&5╤=2!╙:6╪╦,3(╪(#═╘04),1:!/1╩!#3╒-)3─53#2 @(#═┬3╒1(╚$]&╚%1(
═15-%╚%1224>@5$%"3$53╚$%210╘@(" [0╒524─5.5$╤9╚%-%5*!54*!&4─]-
═╚&)┴<╓┼├#7╔─:78@97%╒(&-╧<╥╠╤,├@@.╓1)5─┼324].╚%1!0─╤%#71═871╚
═,2!┼<74@>╞1╔=┬╠╙.#0@.╓╒!5$┬@5$%"3$6@3╘:@1┬┴8*3╒8*┼@╧,├4╓#71═
═871╚,┬!┼<74@=&╒┴=&@╤*╙4╤,┬ [<╘5#3╘┘$╚$╒!5$┬@5$%"3$4-<&]╠>6╤╔
═<╫0@97%╒('1═871╚,┬╠╒,3(@.╓╤)4╒2@3╘:@4$],64=/3┼,-&┴╚:&┴╚:&┴╚:
8&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
END
BEGIN 666 CUBE3D3.2.O
═ ("╔ (╘@╘(╘┴╘*╘8╘"─/"1"-&-"@ *─?┴?╬╔@(7\3+╥!─╨41$1$@(" @(" @
═(" @(" @0╒5"13-$(%8╙+├(-#2 @(" @(" @(" @(" @(" @($)9#9\@(" @
═4╒1%4$┴%3┬!*541$╞2 @("!'14]21╘4@5$%93$]2#0╓;("!#2$5#2╥!/550@
═5$┴%($╔!3┬╪@.34@25-3544@3╘8-┼┬ @0╙╒(04-+24┘'╞╥!&3╒(@34]212!$
═151!24╤3(0╘-'1╓>$─8╤+╘8╥─┬ ═($┼.0╥]$14,@6"╒23╒1!5$┼/3@╘='1)&
═,╥]&-)(@+2!)3─,╧1$5#(%─═4─]4051)3╘╪-'1╘21├4╧1├:2("╘@24┘#+╘1%
═0╥!:+5)/5$%424].#1╘=$┬!&-╥ @─┬ ═(%)%4╘54#1╘=$┬ ╦+╥╘@─┬ ═(%╔/
═3╘╘@24╪╧3╒54#1╘=$┬ @2" @─┬ ═(%1/1╘=,12!(241$14╪@4╒521─%#15,-
═'1╘24╒!!0╘62("╘@5$]'1╘╤%(%-54─9!0╘4@1─┼,3$┼.1╨╘-("!04─534╥!1
═(%1/(%%5250-#04@(" @("!04─534╥!!3┼─@2╘59(%1/($)%1╘┼.#0"╤^_ +
═(-+_╥-#╓┘╧╤,╧($@┘/_) /#┘╩9*%(╪4┼╩92%)╪4╔╩0&-(="╔─╥#2_┌─ ├2'0
═╩4!╔#(7[╩06%_*─ ╚ "┬ !┬1^\┴╔$)#┘&*7[:2┬%^┌7\:0"%_* ┌(╦@$-#─
═╩0"%╚┌─╨┴:2@ *(8╩0"1╚\├0^^:─╥═#╓╩0"%╚┌─╨┴:2% ╩╘8╘"╟╤"0┌-&-"╔
═ (57┴5┬%685@┴3^%085 ┴4*%885┬┴6.%9(5┼┴6:%4*─!┴;6╔0(5╤6"#─_\╞%
═╘ ╬┼8<─\\%'╞84╨-@\╞)╘ ╞┼8?!$╤╞%,#8/)┴═ +╔6+)// ╒┘╞),#8/)┬═ )
═╔6+╨*,9┬3 ╓#╥8?0"┌5├╥3╙╨&>9├3 ╓#╥8╧0":5├\ ╙&8╘╨-@\╞(╘ 9,1╚),
═#8/)*] '┘╟'╞<4╨-@\─═╘ ╫&<<9╤$"├╞<>9╤3 ╓#╥4├0":6╒20&%═4╨-@\─@
═╘ ╞┼4$─!┴5!,#8/)4= #3)╞.>!┬┼9&5┴╥7┬0 ╬┼╪┴608╔65┼8╠┼╪─ +╔>(5┼
═&*5╞96/)>) "┌7┬%9├┬┼9>5╞╠ )╔>(5╟&*5┼96;)>) "┌7┬%:!┬┼9&5╞╥7┬0
═ ╬┼╪┴6─╪╔63┼9╦ ":7┬%:┴┬┼9&5╚╥7┬0 ╬┼╪┴6╠╪╔63┼9[ ":7┬%;!┬┼9&5╟
═╥7┬0 ╬┼╪┴6╘╪╔6├┼9+ ":7┬%;├┬┼9>5─╠ )╔>(5╧&*5─967)>) "┌7┬%<!┬╞
═9[╘ ─*9╚?0"0┴:6╞9[╓ ├╙┬╞:/╓ ├╪6╞╔╞6]@(\0#┴┴)_╓─!"┴┴)_╓─!3-╓#
═"╚6╟.*9╬╧0"0╔╞╫] ) ╪╔╞╧] ) 8╔╞╤] ) 0#┴┴)_╓─!2┴┴)_╓─!3 >$2┴┬╞
═:7╓ ├╙┬╞:╧╓ ├╪6╚.*9╦╧8"/╔╞╙]@(\╪╔╞╫]@(\╪╔╞[]@(\0#┴┴)_╓─!2┴┴)
═_╓─!3#╓$2┴┬╞:7╘ ─!┬╞:╟╘ ─(6╔╔╞^]@(\╪╔╟#]@(^%╩╩9╠╧8"/.*9╬_8"/
═.*9═_8"/.*9╦_8"/$ ╪82?]╔ 4╚82?]╔ 4╥ ┴$╚8╔╞╔] ) ╪╔╞╟] )"%╩╤┬╞
═;+╘ ─*9═?0"0.*9╦_0"0.*9╬_0"0$ ╪82?]╔ 4╚82?]╔ 4╥╓┴$╚8╔╞┼]@(\8
═╔╞╔]@(^%╦!┬╞;[╘ ─*9╨?0"0┴:╓╔ (6├╔0*%╔*((╩0"@ )&├╥-#[┘╩3*╘/2@
═ (11╔%&┘ );0 ╘╥*┴852┘┼$@╤86┼5╘╔*2╚57╤3^╨ ╚4_╔5╟%0; "┴4&┼6$╔*
═2╚58╤4"0 ╚5 ╔6#%0╔ "┴4*┼4/#!╩0"%╚┌4"┴:2╔ (7[╩4"%_*572╔ '╚("$
═╚╪3[&(5╚9:2%╔*5╚9?╥%_*58..57╩╬┬─8- "┘╞"─8*─ 4?═(4:.1╚┌─ ─?═╚
═┬,19╠.^┼╚╘╞ ┴:.%^] $┘╩3╞_,╦0╓─╙═┴*╘8╘$─"├1├0╩0┴% ╚4"3&┌"9╘5%
═(&)204┼.+"!72$%4($1/(%┼/52!704┘4(%1/($1/(%1/3─┼'2%0_╩0"%8(58
═╩?^%6857╔%&┘ ):%─╠┬┘ ):%─\┬┘ ):%┼,├&4╦─ ┼╚65╥+─ ┼╚66╥+─ ┼╚6╬
═╥,92╬0"6┴:_(╬0"6┴;#(╬0"6┴;'(┴%&──╩6┼┴2882?]╔ 84╚╠28╪\2┬%╠╩6╚
═┴2882?]╔ 84╚╠28╪\2┬%╠┌6╦┴2882?]╔ 84╚╠28╪\2┬%═*23╔::%)┴┴)_╓─!
═┴2┬╤)├├╤*!┴┼╠╚6╥╔:╞%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╪6╙╔:╥%)┴┴)_╓─!┴2┬╤
═)├├╤*!┴┼═(6╘╔)2┼╔╪4╞&$╟_:0&%*+$╞./$╚&&6╥┴;*┼╩╚4╞&$╟_:0&%*+$╞
═./$╚&&6╙┴;.┼╦84╞&$╟_:0&%*+$╞./$╚&&6╘┴92╩╧("0╔;*%(┴┴)_╓─!┴22╤
═(├├╤)*9╤╪$#╨%(3[╔'&%)┴┴)_╓─!┴2┬╤)├├╤**3[&&┼ ┴9+%5[ "┴5?%6) "
═┴5┬┼╠╪4┬&$╟_:0&%)+$┬./$─╪$#╨$*1╤┴2882?]╔ 84╚╠28╪\2@8:4"%─\59
═╠ *%6<5@─ *%8*25╔:6%)┴┴)_╓─!┴2┬╤)├├╤*(6╥╔:┬%)┴┴)_╓─!┴2┬╤)├├╤
═*(6╙╔:╬%)┴┴)_╓─!┴2┬╤)├├╤*(6╘╔):┼╔╚4╞&$╟_:0&%*+$╞./$╚&&6╥┴;*┼
═╩84╞&$╟_:0&%*+$╞./$╚&&6╙┴;.┼╦(4╞&$╟_:0&%*+$╞./$╚&&6╘┴;2─╦╩6╟
═┴2882?]╔ 84╚╠28╪\2@89;*%╠╩6╩┴2882?]╔ 84╚╠28╪\2@89;.%╠┌6═┴288
═2?]╔ 84╚╠28╪\2@89;2%╦╩╩\@)"┼╠╚4┬&$╟_:0&%)+$┬./$─╔╟'@0/ 4┴/╬─
═<84╞&$╟_:0&%*+$╞./$╚╔/╠8:4"%┼<57╠ *%5\58─ *%6*6╙┴2(82?]╔ 84─
═╠2(╪\23@0/ 0╔'&%)┴┴)_╓─!┴2┬╤)├├╤*!┴╔0(66╤5╞╨ ╚59╤6"0 ╚5@╔*^┼
═╔84╞&$╟_:0&%*+$╞./$╚┴;*┼╩(4╞&$╟_:0&%*+$╞./$╚┴;.┼╩╪4╞&$╟_:0&%
═*+$╞./$╚┴;2─╠*6╞┴2882?]╔ 84╚╠28╪\2@89;*%╠╩6╔┴2882?]╔ 84╚╠28╪
═\2@89;.%╠┌6╠┴2882?]╔ 84╚╠28╪\2@89;2%═*2╤╔:>%)┴┴)_╓─!┴2┬╤)├├╤
═*!┴┼╠╚6╥╔:╩%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╪6╙╔:╓%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼
══(6╤╩╦╥ ─*6╥┴2(82?]╔ 84─╠2(╪\22╞<>! \!2$^┌1╤┴2882?]╔ 84╚╠28╪
═\2┬─^╤┴╔0(6╧╤5>╨ ╚57╤5┬0 ╚58╔;.%(┴┴)_╓─!┴22╤(├├╤).! \!"─<84╞
═&$╟_:0&%*+$╞./$╚&&┼ ┴;#%6; "┴5╟%8) "┴6"┼═?!'╔94╪┘9*╚╔; ╪┘9:%
═)┴┴)_╓─!┴2┬╤)├├╤*(7[╔:\╪┘96╚╔98╪┘9.%)┴┴)_╓─!┴2┬╤)├├╤*,7[, _&
═4╧ *┘┼'╞4>91╤┼+0]╞"┼─╚7[╔9.%_*65┴?╓┼┼╚7^(-"+╔96%^┌66┴?╥┼╦╪7]
═╔;"%_┬#0┬\92╘ -,=╪╬─4;─ ┼╚65╥+─ ┼╚66╥+─ ┼╚6╬╥(11╔)6┼╔84╞&$╟_
═:0&%*+$╞./$╚┴;*┼╩(4╞&$╟_:0&%*+$╞./$╚┴;.┼╩╪4╞&$╟_:0&%*+$╞./$╚
═┴;2─┼╩6╞┴2882?]╔ 84╚╠28╪\2@89;*%╠╩6╔┴2882?]╔ 84╚╠28╪\2@89;.%
═╠┌6╠┴2882?]╔ 84╚╠28╪\2@89;2%═*2╬╔:>%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╚6╥
═╔:╩%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼╠╪6╙╔:╓%)┴┴)_╓─!┴2┬╤)├├╤*!┴┼═(6╬╩╦╥
═─*6╥┴2(82?]╔ 84─╠2(╪\22╞<>! \!2$^┌1╤┴2882?]╔ 84╚╠28╪\2┬─^╤┴╔
═0(65╤5>╨ ╚57╤5┬0 ╚58╔;.%(┴┴)_╓─!┴22╤(├├╤).! \!"─<84╞&$╟_:0&%
═*+$╞./$╚&&┼ ┴9;%6; "┴5╟%8) "┴6"┼┼87[╔9:%_*6╧┴?╓┼╠(7^(-"+╔96%
═╦┌66┴;#&4╧ #3!&*╔9*%_:63┴?┌┼╦╪7[╔;"%_"#0┬╓!╙04╒%(%1(24┘'(%=%
═($1/($5615)9($┘)1╘┴4+"!╨24┘+63╚@5%)9(%1/(%1!2╘4@3╒9%4┬!42$4@
═5╘]23$0┴;─%21┬&┼4- +╩0"%╚┌4"┴:1,┘╪╬╔ (6├╩4"%╔#┬┼_>7[╠!.┼_╩3\
═┴?╥$_╩7[╔/╓$^╪7]..7[┴6>╞^╪╔*2─╔*─ 6@@(2├&&6─┴:0╪╔?[┼_+ $2?]╔
═ 85╚╤6>0 ╘╥-├:3\╤/┌] (^%_87^─ -,╪╪╥┼4/!3╔╞>┼9╘╔&_╧ 0┘6┬0,<╦0
═]:7]1?┘1╚┘&├8$┬┼_5&├─:.╔_╪7]┴?┌╔@$6├┴:/0 ╬:─:.5╚╠ -┼9\├*╘,╔,
═38╤┼9╘┬┼_47^4:.1╚┌7^┴?╒╚╥,╦0╠╓"╞9┌5╟2─;^\!#┼:) ╤╥═#╒╔?╒%_┴&├
═─:-@2*7]$:.1╚┌╟_┴?╓%_╩╞ 1:.%╚] "┘╩1╚┘6┬╨ ╓5╟╥,╦0╥─╥@├&5╟2*7]
═1?╪1╚┘&├╔?┌%_6├(╥═"╙8*50\%.╞9┌5╟2─;^\!#┼:) ╤╥═#╒╔?╒%_┼&├─:-@
═2*7]4:.1╚┌╟_┴?╓%_╩╞ 1:.%╚] "┘╩1╚┘6┬╨ ╓5╟┬,╦0╥─╙╫├&5╟2*7]1?┘1
═╚┘&├╔?┌%_6┬(╥═"╙8*9╟╔6=*1╧[╨$.5╚─#'*╘/6┼_47^$:.1╚╓!(╔?╘1╚┘&├
═╩?^%_87^╩8!%╚╪6├╘ +╞╔&├┼:+ #96>(╥═#*3$╩-96=(╔?╒%_┴&├─:.┼_╚7]
═:(├*╘+-@╔/╥] (^%_4╔%_87]╤/┌╨?╩50\#╩╞:/ ,╔6┴*.,├┼9┘ $╥═#╪8&5╚
═2*7]4:.1╚╓┴&_3├╨!╠╦0┘4╥╤├4┬╔@(7]1:.%╚] "┘╩1╚╥═#13+&-╔╞├╨%*5╚
═2├┴(╔?╘1╚┘&├:,├┼9┘ *╥═#╨╔?╘1╚┘&├8&5╚1╧╘╪\ ;*╘-],\╪╒(╩8"%_46├
═┴:/0 ╬:─:,╦0╥╘╙╙├:50\#╩╞:/ ,╔6┴*.(├┼9┘ $╥═#╪8&5╚2*7]4:.1╚╓┴&
═_3├╨!╠╦0┘4╨╧├─┬╔@(7]1:.%╚] "┘╩1╚╥═#13"^.╔╞├╨%*5╚2├┴(╔?╘1╚┘&├
═:(├┼9┘ *╥═#╨╔?╘1╚┘&├8&5╚1╧╘╪\ ;*╘-],<8┘(╩8"%_46├┴:/0 ╬:─:,╦0
═╥╘╤╤├╩╘8╘"╟╒├1├08%-024┘!3"!#4─%#2╘52(%-,2┬ ╓+╙─╒
═
═ #_?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_?╙\?
═#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_
═?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\' ╨'_?╙\?#╨<# ?]_/╤\/!╨,!_╫\_'╨\'
═ ╨'_?╙\?#╨<# 1╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
!&┴╚:
END
BEGIN 666 SHAPE3.2
═ 1╨┴' ├╥!#54)%,╘0@4╘┴!4$4@24┘)5"!04─]'4─%- $<<!0"7-3$╠,├4╒
═.╔<╒,┬╨╤,├<┌┼╙4╒+#(╒-3╩7-38╠,3(╫.╔╨ ;┴╤┬ (\@34%)3┬!04─]'4─%-
═(%-405)44╥!!5"!,24┘%(#4╨,# =!╤├ #╚ ┬!╤─ (\@4%)/1╒)!32!.3╒1%
═4╨":'&╪ ├╥!33$╚@-┬\╤-┬\┘-0"╨''@ ├╥!$051!($9/4─╒!5"!)4╙╚ ╒┴╤]
═ (\@3┼5-4$])3┼13+%@╤+%─╤+%╚╤+%@╥+%─╥+%╚╥+"╪╬+@#╫'(( ├╥!42$4@
═4$],64=/3┬!,25-4("╔-55-4*┬!"10 5'8< ├╥!415)-24┘!5$5$(%=)5$@@
═02!:15)/(0 ;'8─ .@ ^'8╨ ├╥!/1┬!#3╒524╘4╠(%1(15)%($┼3($$@3$]4
═($]& %╪=─0"/($154$╤)0╘%424].($1205=)3─<@3$┼.15, @╤╓3 (\@5╘┴%
═3┬!&04-%4╥!!4─5.)╒0@0─5)3─<@1─┼,3$5$ *8=┼@"/($$@1─%35"!04─]'
═4─%-(%=/54╤$3┬=4($1205< ╥┴╓@ (\@5$┴%(%-!344@3$┼.12!45╘┼#12╨@
═0┼54(%1(25, ┌!╓┼ (\@25,@1╘]/1"!%3─]51╘@@1─]2($┘/5╥$ "┴┌╟ (\@
═3╘8@0╘]54┼-%+"!&3╒(@1─┼,3$5$($9!0╘53 "╠>╩ "/(%1(25,@25,@3─\@
═3$].1╘52($%.($┼34╒5% #$>╩@ ┌ %8>═ "/($9%14╨@1┼)%12!43╥!0550@
═64]54┬!/5╘╪@1$%400!\'╦─ ├╥!)3┬╨@0┼54($-(04┘'12!42$4@4$]+12!)
═3┬!,24┘% )@>╧@"/(#4╨,#4@5$\@55-%($,╤($%.1"!#,@">'╠@ .@##'═(
═├╥!33╒)262!!0─]55"!33╘╒%($]&(%1(12!,25143$4 ╫┴[7 (\@0┼5'4╥╨@
═15(╬+┬╪@1─5!5%5215, _┴[< (\@5$┴)4╥!705,@02!214%,(%)54╘@@2─]"
═+@ $'^8 .@ ╟'_ ├╥!!3─0@248@64]5($9%14╨@4╘\@24┘#3$┼.140╠ $0?
═^@"/(%=2251%(%1/(%-*541$0$┘752┘%1%4 2┴\$ 3╚ :1\. 8\@04┘$($%"
═3╒9%($%,3"╨@2$%612!&54╪┴ &\?& $┌ ($?┘@./($9)4┼-4(%-(05!% )<?
═┘╨-!,;+"*#8╤*3╔!,╦+"*#8╥*0#''^@#@╥ ╘+"╘╥-┬╨═,├8╠-├0╠,├8╠+3(╓
═+#8╘+#(╓+#8╘+#8╘+"╘╥-┬╨╓-"╨╓- #╙'_(#@╥ ╘+"╘╥-┬╨═,├8╠,"╨╥-┬╨═
═,├8╠,"╨╥-┬╨╓-"╨╨+"╘╥-┬╨╓-"╨╨ !<@_ .#(#,╠,"╨═,├8╠,╙(╠,38╠,╙(╠
═,╙(╠+3$╓+#,╥+#,╥ !\@!@2#(# ,┬!*!(\@4╘5#3╘┘$(%-(05!% $@@2╨1"
═,;+"*#8╤*3╔",╦+"*#8╥*0!\($╨$@╥ ╘+"╘╤-2╨╙,"╨═,3(╠+3$╒+"╘╙,"╨═
═,3(╠+34╫+"╘╙,"╨═,╥╨═-3$╠+38╠+3, ╦"!6!(,@-"╨╤-2╨╙,"╨═,3(╠-3$╠
═+38╠+3,╠-3<╠+3,╨+"╘╙+#$╒+"╘╙,"╨═,3( ╪"!@!(,@-"╨╤-2╨╙,"╨═,3(╠
═,34╠+3,╨+"╘╤,┬╨═,34╠+3,╨+"╘╤,┬╨═,34╠,╙ ╠+3$╥ "0┴:@2#(#<╠,34╠
═+3,╨+"╘╤,┬╨╒-╥╨═,╙ ╠+3,╠,╙,╠+3,╨+#8╠,"╨═,╙ ╠,3(╠+3,╙+"╘╙,"╨╓
═+"╘╒-╥╨═,╙ ╠+3, -┬%╠!(,@+3$╒+"╘╙,"╨═,3( 6╥%╘!(,@,╥╨╙,╥╨═,╙ ╠
═,"╨╙,╥╨═,╙ ╠+30╠,╙─╠+3,╨+"╘╥ (,┴?@2#(#,╠+3,╙+"╘╙,"╨╨+"╘╙.2╨═
═,╙ ╠+3(╠+3,╙+"╘╙,"╨═- "╧(8@$@╥ ╘+#8╠+3,╨+#,╠-┬╨═,╙ ╠+38╠,3@╠
═+3,╨+"╘╘+#$╪+"╘╙,"╨╤ -\┴─@2#(#0╠+38╠+3,╨+#,╠+3$╪+"╘╙,"╨╤+"╘╤
═."╨═,╙ ╠+30╠+38╠+3,╨+"╘╓ <┬╟ 2#(#,╠+34╫+"╘╙,"╨═,╥╨═,╙,╠+3,╨
═+#8╠+34╤+"╘╤,┬╨═,╨ ╧(╩8$@╥ ╙+"╘╙,╥╨═,╙ ╠-┬╨═,34╠,╙ ╠+3$╥+"╘╒
═,2╨═,3(╠+3, 4╥*╨!(,@,╥╨═,34╠,╙ ╠+3$╥+"╘╙,╥╨═,╙ ╠-┬╨╨+#8╠,3(
═=2*┌!(,@,╥╨╨+#8╠,3(╠+3,╙+"╘╙,"╨╓+# ╠+3,╨+#$╥ )─┬╤ 2#(#,╠,34╠
═,╙ ╠+3$╥+"╘╤-2╨╙,"╨═,3(╠,"╨╓+#$╥ +╚┬╙@2#(#,╠,"╨═,╙ ╠,3(╠,╙,╠
═+3,╨+#8╠,"╨╓+#$╥ -╨┬╓ 2#(#,╠,"╨╓+#$╥+#,╙+"╘╙,"╨╓+#$╒+#,╨+"╘╤
═,@ !(^($@╥ ╙+#$╒+#,╨+"╘╤,┬╨╙,╥╨═,╙ ╠-┬╨╒,2╨═,3(╠+3, )┬/╠!(,@
═,╥╨╙,╥╨═,╙ ╠-┬╨╒-╥╨═,╙ ╠+3,╠-3$╠+3$╥+"╘╙ "╪├]@2#(# 0",2!8\@
═5$┴)4─0@4╘┴!4$4 5┬,3!4,╤╠╠(╚-├$╔.─,╥╠╠(╚-├(╔ ' ├% 6/(%┼/55(@
═1$%402!'3╘53($┴%4─4 >"/0!╪,@, ",(╪@30┼"╥,├4╓╦"@┘╦#$╓╩├8╔ + ├
═├!./($-(04┘'12!"14╤/5╥!43╥!03╘┼.5"!43╥!$051! ,(├├1.7-├4╠0├$┌
═┼╙8╓+$(╥ .$├─┴.'3├╩70┼ ╠3├╔"4+)"4*╚╤.╚═.╠├"╟-3 ╒, #╔(┘<3╞2!.
═ 8─╟!.!2;(╤╔#.╠3├╩'4#╩+4+,╨╔╒"╥,├4╓╩┼ &"2╞$┘="4"╤0.─)0╠─)0
═╩├$ (┬2╦$┘─┬+┬([ "╪─╠!.".╚─╒,#$╨ #\─╬┴.>,╙(╫-├@┌╟#╩,.╚ :
═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
0&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
END
BEGIN 666 TABLES$8F80-$95FF
═@(\ @,%!╨@*"╨╘/$!$3%!47&!─:&╤╨='1╪>'╤\@(" @(" @'╤\>'┴╘='!╠:
═&1@7%103$1 /#0╠*" <% ╨( _╧╫[^?├╓]?/╤\._═[.╧╔┌.?╞┘>3├╪^+┬╪>'@
═╪.#@╪.#@╪>'┬╪╬/├┘.7╞┘^├╔┌^╙═[_#╤\_7╓^/╟[_?╪ _╨ #_\" @(" ?
═'╤╪>'1╘<&╤╚9&!<5%!,1$ \-"╨╚(!╨4# @#^_?╧┘^/;╒\_'╨[^╫╠┌^╟╚┘^;┼
═┘./├╪╬+┴╪>#@╪.#@╪.#┴╪>+┬╪^/─┘>;╟┌.╟╦[.╫╧\/'╙]?;╪^?╧]_@ " ╨4'
═" ╚+#0\0$1,4%1<8&1╚;'!╘='┴╪?'╥ @(" _____╨ (┬(┬(┬(├(╥,├(╥,├
═(╥,─)"0─)"0─)"4┼)24┼)24┼)┬8╞)┬8╞)┬8╟)╥<╟)╥<╟*"@╚*"@╚*"─╔*2─╔
═*2╚╩*┬╚╩*┬╠╦*╥╠╦*╥╨╠+"╨╠+"╘═+2╘═+┬╪╬+┬╪╬+╥\╧+╙ ╨,# ╨,3$╤,3$╥
═,├(╥,╙,╙,╙0╘-#0╒-34╒-├8╓-├<╫-╙@╪.#@8&!@8&1─9&1─9&1─9&1─9&1─9
═&1─9&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╠;&╤╠;&╤╠;&╤╠;&╤╠;&╤╨<'!╨<'!╨<'!╨<
═'!╨<'1╘='1╘='1╘='1╘='1╪>'┴╪>'┴╪>'┴╪>'┴\?'╤\?'╤\?'╤\?(" @(" @
═(" @(" ┴(2$┴(2$┴(2$┴(┬(┬(╧__ /____\ \ _╨#__╨ #_____
═ /____\ _____╨ #_ /__ /_╨__\ _____╨ #_
═____ /____\ _____╨ #_____ /____\ _____╨
═ #_____ /_╨ 0$! 0$! 0$" @(" @(# ╨,#! 0$
═! 4%!04&!@8'!╨<(" @)"0─*"@╠+"╨╨,#0╘.#@\/$! 1$1(2$╤,4%!45%┴<7
═&!@9&┴╚;'!╨='┴╪?(" ┴(┬,├)"4╞)┬<╚*2─╩*╥╨═+┬╪╧,#$╥,╙0╒-38╫.#─┌
═.╙╨]/├] 04)#1$5&1╘┴)2─═-3─]045)35%976"╠╩*2─╚)╥8╞)20├(╥(┴(" ?
═'┴╪='!╨;&┴╚9&!@7%╤85%104$╤,2$┴$1$! /#╨╪.#0╘,# ╠+"╨╚*"0─)" @(
═!╨<'!@8&!04%!00$! 0# ╨,# @(" @(" 0$! 0$! 0$
═ $! 0$! 0$! @(" @(" ╨,# ╨0$! 0%!04%!@8&!╨<'" @(
═"0─)"@╚+"╨╠,# ╘-#@╪/#╤ 0$1$2$┴,3%!05%187%╤@8&1╚:&╤╨<'1╪>'╥ @
═(2(├(╥0┼)┬8╟*"─╔*┬╠╠+2╪╬+╙ ╤,├,╘-34╓-╙@┘.├╠\/3╪_0$%"0╘1%1─=(
═24╔+34┘/4%%24╒165╒@╦*┬─╔*"<╞)┬4─(╥,┬(2 @'╤╪>'1╨<&╤╚:&1@8%╤<6
═%144%!,3$┴(1$1 0#╨\.#@╘-# ╨+"╨╠*"@─)"0@(" <'!╨8&!@4%!04$! 0$
═ ╨,# ╨(" @(" @$! 0$! 0$! ! 0$!
═ 0$! 0(" @(" @,# ╨,$! 0$!04%!08&!@<'!╨@(" ─)"0╚*"╨╠+# ╨-#0╪.
═#╨\0$!$1$┴(3$╤04%146%╤<8&!─:&┴╠<'!╘>'┴\@("$┬(╥,─)28╞)╥@╔*2╚╦
═+"╘╬+┬\╨,3(╙-#4╒-├<╪.3╚[/#╘^/╘ _/├╘\.╙╚┘.#<╓-34╘,╙(╤,"\╬+┬╘╠
═*╥╚╔*2@╟)┬8┼)",├(┬$@(!\>'┴╘<'!╠:&┴─8&!<7%┴45%!03$╤(2$1$0$ \/
═#@╪-#0╨,"╨╠+"@╚)"0─(" @'!╨<&!@8%!04%! 0$! ,# ╨," @(" @(! 0$!
═ 0$! 0 0$! 0$! 0$" @(" @(# ╨,#
═! 0$! 4%!04&!@8'!╨<(" @)"0─*"@╠+"╨╨,#0╘.#@\/$! 1$1(2$╤,4%!45
═%┴<7&!@9&┴╚;'!╨='┴╪?(" ┴(┬,├)"4╞)┬<╚*2─╩*╥╨═+┬╪╧,#$╥,╙0╒-38╫
═.#─┌.╙╨]/├] /╙╪]/#╠┌.3@╫-├4╒-#,╥,3 ╧+┬╪═+"╠╩*2─╚)╥8╞)20├(╥(┴
═(" ?'┴╪='!╨;&┴╚9&!@7%╤85%104$╤,2$┴$1$! /#╨╪.#0╘,# ╠+"╨╚*"0─)
═" @(!╨<'!@8&!04%!00$! 0# ╨,# @(" @(" 0$! 0$! 0$
═ !╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
═&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
┼&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:&┴╚:
END
********************************
*└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
*└╙TEPHEN└╩UDD└└└└└└└└└└└└└└└└└*
*└╟EORGE└╘AYLOR└└└└└└└└└└└└└└└└*
*└╙TARTED:└7/11/94└└└└└└└└└└└└└*
*└╞INISHED:└7/19/94└└└└└└└└└└└└*
*└V2.0└├OMPLETED:└12/17/94└└└└└*
*└V3.0└├OMPLETED:└3/20/95└└└└└└*
*└V3.1└├OMPLETED:└6/14/95└└└└└└*
*└V3.2└├OMPLETED:└6/15/95└└└└└└*
*└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
*└╫ELL,└IF└ALL└GOES└WELL└THIS└└*
*└PROGRAM└WILL└ROTATE└A└CUBE.└└*
*└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
*└V2.0└+└╬EW└AND└╔MPROVED!└└└└└*
*└╬OW└WITH└FASTER└ROUTINES,└└└└*
*└HIDDEN└SURFACES,└FILLED└└└└└└*
*└FACES,└AND└EXTRA└TOP└SECRET└└*
*└TEXT└MESSAGES!└└└└└└└└└└└└└└└*
*└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
*└V3.0└+└╞AST└CHUNKY└LINE└└└└└└*
*└ROUTINE.└└└└└└└└└└└└└└└└└└└└└*
*└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
*└V3.1└+└╟ENERAL└POLYGON└PLOT└└*
*└WITH└HIDDEN└FACES└(╪-PRODUCT)*
*└AND└ZOOM└FEATURE.└└└└└└└└└└└└*
*└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
*└V3.2└+└┼╧╥-BUFFER└FILLING└└└└*
*└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
*└╘HIS└PROGRAM└IS└INTENDED└TO└└*
*└ACCOMPANY└THE└ARTICLE└IN└└└└└*
*└├=╚ACKING,└╩UN.└95└ISSUE.└└└└*
*└╞OR└DETAILS└ON└THIS└PROGRAM,└*
*└READ└THE└ARTICLE!└└└└└└└└└└└└*
*└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
*└╫RITE└TO└US!└└└└└└└└└└└└└└└└└*
*└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
*└═YSELF└WHEN└YOUNG└DID└└└└└└└└*
*└EAGERLY└FREQUENT└└└└└└└└└└└└└*
*└─OCTOR└AND└╙AINT,└AND└HEARD└└*
*└GREAT└┴RGUMENT└└└└└└└└└└└└└└└*
*└└┴BOUT└IT└AND└ABOUT:└BUT└└└└└*
*└└EVERMORE└└└└└└└└└└└└└└└└└└└└*
*└├AME└OUT└BY└THE└SAME└─OOR└└└└*
*└AS└IN└╔└WENT.└└└└└└└└└└└└└└└└*
*└└└└-└╥UBAIYAT└└└└└└└└└└└└└└└└*
*└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
*└╘HOUGH└╔└SPEAK└WITH└THE└└└└└└*
*└TONGUES└OF└MEN└AND└OF└ANGLES└*
*└AND└HAVE└NOT└LOVE,└╔└AM└└└└└└*
*└BECOME└AS└SOUNDING└BRASS,└OR└*
*└A└TINKLING└CYMBAL.└└└└└└└└└└└*
*└└└└-└1└├ORINTHIANS└13└└└└└└└└*
*└└└└└└└└└└└└└└└└└└└└└└└└└└└└└└*
*└╨.╙.└╘HIS└WAS└WRITTEN└USING└└*
*└└└└└└═ERLIN└128.└└└└└└└└└└└└└*
********************************
╧╥╟ $8000
*└├ONSTANTS
┬╒╞╞1 ┼╤╒ $3000 ;╞IRST└CHARACTER└SET
┬╒╞╞2 ┼╤╒ $3800 ;╙ECOND└CHARACTER└SET
┼╧╥┬╒╞ ┼╤╒ $4000 ;┼╧╥-BUFFER
┬╒╞╞┼╥ ┼╤╒ $┴3 ;╨RESUMABLY└THE└TAPE└WON'T└BE└RUNNING
╪1 ┼╤╒ $╞┬ ;╨OINTS└FOR└DRAWING└A└LINE
┘1 ┼╤╒ $╞├ ;╘HESE└ZERO└PAGE└ADDRESSES
╪2 ┼╤╒ $╞─ ;DON'T└CONFLICT└WITH└┬┴╙╔├
┘2 ┼╤╒ $╞┼
╧╠─╪ ┼╤╒ $╞─
├╚╒╬╦ ┼╤╒ $╞┼
─╪ ┼╤╒ $67 ;╘HIS└IS└SHARED└WITH└╘1└BELOW
─┘ ┼╤╒ $68
╘┼═╨1 ┼╤╒ $╞┬ ;╧F└COURSE,└COULD└CONFLICT└WITH└X1
╘┼═╨2 ┼╤╒ $╞├ ;╘EMPORARY└VARIABLES
┌╘┼═╨ ┼╤╒ $02 ;╒SED└FOR└BUFFER└SWAP.└└─ON'T└TOUCH.
┌1 ┼╤╒ $22 ;╒SED└BY└MATH└ROUTINE
┌2 ┼╤╒ $24 ;─ON'T└TOUCH└THESE└EITHER!
┌3 ┼╤╒ $26
┌4 ┼╤╒ $28
╦ ┼╤╒ $┬6 ;├ONSTANT└USED└FOR└HIDDEN
;SURFACE└DETECTION└-└DON'T└TOUCH
╚╔─┼ ┼╤╒ $┬5 ;┴RE└SURFACES└HIDDEN?
╞╔╠╠ ┼╤╒ $50 ;┴RE└WE└USING└┼╧╥-FILL?
┴╬╟═┴╪ ┼╤╒ 120 ;╘HERE└ARE└2*PI/ANGMAX└ANGLES
*└╓╔├
╓═├╙┬ ┼╤╒ $─018
┬╦╟╬─ ┼╤╒ $─020
┬╧╥─┼╥ ┼╤╒ $─021
╙╙╘┴╥╘ ┼╤╒ 1344 ;ROW└9└IN└SCREEN└MEMORY└AT└1024
*└╦ERNAL
├╚╥╧╒╘ ┼╤╒ $╞╞─2
╟┼╘╔╬ ┼╤╒ $╞╞┼4
*└╙OME└VARIABLES
╟╠╧┬╪═╔╬ = $3╞ ;╘HESE└ARE└USED└IN└CLEARING└THE
╟╠╧┬╪═┴╪ = $40 ;DRAWING└(GLOBAL)└BUFFER
╟╠╧┬┘═╔╬ = $41
╟╠╧┬┘═┴╪ = $42
╠╧├╪═╔╬ = $57 ;╘HESE└ARE└USED└IN└CLEARING└THE
╠╧├╪═┴╪ = $58 ;┼╧╥└(LOCAL)└BUFFER
╠╧├┘═╔╬ = $59
╠╧├┘═┴╪ = $60
╨1╪ = $92 ;╘HESE└ARE└TEMPORARY└STORAGE
╨1┘ = $93 ;╒SED└IN└PLOTTING└THE└PROJECTION
╨1┌ = $94
╨2╪ = $95 ;╘HEY└ARE└HERE└SO└THAT└WE
╨2┘ = $96 ;DON'T└HAVE└TO└RECALCULATE└THEM.
╨2┌ = $┴┼
╨3╪ = $┴╞ ;╘HEY└MAKE└LIFE└EASY.
╨3┘ = $┬0
╨3┌ = $┬1 ;╫HY└ARE└YOU└LOOKING└AT└ME└LIKE└THAT?
╨1╘ = $┬2 ;─ON'T└YOU└TRUST└ME?
╨2╘ = $┬3
╨3╘ = $┬4 ;╚AVING└ANOTHER└CHILD└WASN'T└MY└IDEA.
╔╬─┼╪ = $51
├╧╒╬╘╨╘╙ = $52
┌╧╧═ = $71 ;┌OOM└FACTOR
─╙╪ = $61 ;─╙╪└IS└THE└INCREMENT└FOR
;ROTATING└AROUND└X
─╙┘ = $62 ;╙IMILAR└FOR└─╙┘,└─╙┌
─╙┌ = $63
╙╪ = $64 ;╘HESE└ARE└THE└ACTUAL└ANGLES└IN└X└Y└AND└Z
╙┘ = $65
╙┌ = $66
╘1 = $67 ;╘HESE└ARE└USED└IN└THE└ROTATION
╘2 = $68
╘3 = $69 ;╙EE└THE└ARTICLE└FOR└MORE└DETAILS
╘4 = $6┴
╘5 = $6┬
╘6 = $6├
╘7 = $6─
╘8 = $6┼
╘9 = $6╞
╘10 = $70
┴11 = $┴5 ;╘HESE└ARE└THE└ELEMENTS└OF└THE└ROTATION└MATRIX
┬12 = $┴6 ;╪┘┌
├13 = $┴7
─21 = $┴8 ;╘HE└NUMBER└DENOTES└(ROW,COLUMN)
┼22 = $┴9
╞23 = $┴┴
╟31 = $┴┬
╚32 = $┴├
╔33 = $┴─
***└═ACROS
═╧╓┼ ═┴├
╠─┴ ]1
╙╘┴ ]2
<<<
╟┼╘╦┼┘ ═┴├ ;╫AIT└FOR└A└KEYPRESS
╫┴╔╘ ╩╙╥ ╟┼╘╔╬
├═╨ #00
┬┼╤ ╫┴╔╘
<<<
─┼┬╒╟ ═┴├ ;╨RINT└A└CHARACTER
─╧└0└└;─ON'T└ASSEMBLE
╠─┴└#]1
╩╙╥└├╚╥╧╒╘
├╠╔
>>> ╟┼╘╦┼┘ ;┴ND└WAIT└TO└CONTINUE
├═╨ #'S' ;═Y└SECRECT└SWITCH└KEY
┬╬┼ ╠1
╩╙╥ ├╠┼┴╬╒╨
╩═╨ ─╧╬┼
╠1 ├═╨ #'X' ;═Y└SECRET└ABORT└KEY
┬╬┼ ─╧╬┼
╩═╨ ├╠┼┴╬╒╨
╞╔╬
─╧╬┼ <<<
─┼┬╒╟┴ ═┴├
─╧└0
╠─┴ ]1
╙╘┴ 1024
╞╔╬
─╧╬┼┴ <<<
*-------------------------------
╠─┴ #$00
╙╘┴ ┬╦╟╬─
╙╘┴ ┬╧╥─┼╥
╠─┴ ╓═├╙┬
┴╬─ #%00001111 ;╙CREEN└MEMORY└TO└1024
╧╥┴ #%00010000
╙╘┴ ╓═├╙┬
╠─┘ #00
╠─┴ #<╘╘┼╪╘
╙╘┴ ╘┼═╨1
╠─┴ #>╘╘┼╪╘
╙╘┴ ╘┼═╨2
╩═╨ ╘╔╘╠┼
╘╘┼╪╘ ╚┼╪ 9305111111 ;CLEAR└SCREEN,└WHITE,└CRSR└DN
╘╪╘ '└└└└└└└└└└└└└CUBE3D└V3.2',0D,0D
╘╪╘ '└└└└└└└└└└└└└└└└└└BY',0D
╚┼╪ 9╞ ;CYAN
╘╪╘ '└└└└STEPHEN└JUDD'
╚┼╪ 99
╘╪╘ '└└└└GEORGE└TAYLOR',0D,0D
╚┼╪ 9┬
╘╪╘ '└└CHECK└OUT└THE└JAN.└95└ISSUE└OF',0D
╚┼╪ 96
╘╪╘ '└└C=HACKING'
╚┼╪ 9┬
╘╪╘ '└FOR└MORE└DETAILS!',0D
╚┼╪ 0─1─1─9┼12
╘╪╘ 'F1/F2',92
╘╪╘ '└-└INC/DEC└X-ROTATION',0D
╚┼╪ 1─1─12
╘╪╘ 'F3/F4',92
╘╪╘ '└-└INC/DEC└Y-ROTATION',0D
╚┼╪ 1─1─12
╘╪╘ 'F5/F6',92
╘╪╘ '└-└INC/DEC└Z-ROTATION',0D
╚┼╪ 1─1─12
╘╪╘ '└F7└└',92
╘╪╘ '└-└RESET',0D
╚┼╪ 1─1─12
╘╪╘ '└+/-└',92
╘╪╘ '└-└ZOOM└IN/OUT',0D
╚┼╪ 1─1─12
╘╪╘ '└└H└└',92
╘╪╘ '└-└TOGGLE└HIDDEN└SURFACES',0D
╚┼╪ 1─1─12
╘╪╘ 'SPACE',92
╘╪╘ '└-└TOGGLE└SURFACE└FILLING',0D,0D
╘╪╘ '└└PRESS└Q└TO└QUIT',0D
╚┼╪ 0─05
╘╪╘ '└└└└└└PRESS└ANY└KEY└TO└BEGIN',0D
╚┼╪ 00
╘╔╘╠┼ ╠─┴ (╘┼═╨1),┘
┬┼╤ :├╧╬╘
╩╙╥ ├╚╥╧╒╘
╔╬┘
┬╬┼ ╘╔╘╠┼
╔╬├ ╘┼═╨2
╩═╨ ╘╔╘╠┼
:├╧╬╘ >>> ╟┼╘╦┼┘
****└╙ET└UP└TABLES(?)
*└╘ABLES└ARE└CURRENTLY└SET└UP└IN└┬┴╙╔├
*└AND└BY└THE└ASSEMBLER.
╘┴┬╠┼╙ ╠─┴ #>╘═┴╘╚1
╙╘┴ ┌1+1
╙╘┴ ┌2+1
╠─┴ #>╘═┴╘╚2
╙╘┴ ┌3+1
╙╘┴ ┌4+1
****└├LEAR└SCREEN└AND└SET└UP└"BITMAP"
╙┼╘╒╨ ╠─┴ #$01 ;╫HITE
╙╘┴ $─021 ;╘HIS└IS└DONE└SO└THAT└OLDER
╠─┴ #147 ;MACHINES└WILL└SET└UP
╩╙╥ ├╚╥╧╒╘
╠─┴ #$00 ;CORRECTLY
╙╘┴ $─021
╠─┴ #<╙╙╘┴╥╘
┴─├ #12 ;╘HE└GOAL└IS└TO└CENTER└THE└GRAPHICS
╙╘┴ ╘┼═╨1 ;├OLUMN└12
╠─┴ #>╙╙╘┴╥╘ ;╥OW└9
╙╘┴ ╘┼═╨1+1 ;╙╙╘┴╥╘└POINTS└TO└ROW└9
╠─┴ #00
╠─┘ #00
╠─╪ #00 ;X└WILL└COUNT└16└ROWS└FOR└US
├╠├
:╠╧╧╨ ╙╘┴ (╘┼═╨1),┘
╔╬┘
┴─├ #16
┬├├ :╠╧╧╨
├╠├
╠─┴ ╘┼═╨1
┴─├ #40 ;╬EED└TO└ADD└40└TO└THE└BASE└POINTER
╙╘┴ ╘┼═╨1 ;╘O└JUMP└TO└THE└NEXT└ROW
╠─┴ ╘┼═╨1+1
┴─├ #00 ;╘AKE└CARE└OF└CARRIES
╙╘┴ ╘┼═╨1+1
╠─┘ #00
╔╬╪
╘╪┴ ;╪└IS└ALSO└AN└INDEX└INTO└THE└CHARACTER└NUMBER
├╨╪ #16
┬╬┼ :╠╧╧╨ ;╬EED└TO└DO└IT└16└TIMES
****└├LEAR└BUFFERS
╠─┴ #<┬╒╞╞1
╙╘┴ ┬╒╞╞┼╥
╠─┴ #>┬╒╞╞1
╙╘┴ ┬╒╞╞┼╥+1
╠─┘ #$00
╠─╪ #24 ;┴SSUMING└ALL└THREE└BUFFERS└ARE
╠─┴ #$00 ;BACK-TO-BACK
:┬╠╧╧╨ ╙╘┴ (┬╒╞╞┼╥),┘
╔╬┘
┬╬┼ :┬╠╧╧╨
╔╬├ ┬╒╞╞┼╥+1
─┼╪
┬╬┼ :┬╠╧╧╨
****└╙ET└UP└BUFFERS
╠─┴ #<┬╒╞╞1
╙╘┴ ┬╒╞╞┼╥
╠─┴ #>┬╒╞╞1
╙╘┴ ┬╒╞╞┼╥+1
╙╘┴ ┌╘┼═╨ ;ZTEMP└WILL└MAKE└LIFE└SIMPLE└FOR└US
╠─┴ ╓═├╙┬
┴╬─ #%11110001 ;╙TART└HERE└SO└THAT└SWAP└BUFFERS└WILL└WORK└RIGHT
╧╥┴ #%00001110
╙╘┴ ╓═├╙┬
****└╙ET└UP└INITIAL└VALUES
╔╬╔╘ ╠─┴ #00
╙╘┴ ╠╧├╪═╔╬
╙╘┴ ╠╧├╪═┴╪
╙╘┴ ╠╧├┘═╔╬
╙╘┴ ╠╧├┘═┴╪
╙╘┴ ╟╠╧┬╪═╔╬
╙╘┴ ╟╠╧┬┘═╔╬
╙╘┴ ╟╠╧┬╪═┴╪
╙╘┴ ╟╠╧┬┘═┴╪
╙╘┴ ─╙╪
╙╘┴ ─╙┘
╙╘┴ ─╙┌
╙╘┴ ╙╪
╙╘┴ ╙┘
╙╘┴ ╙┌
╙╘┴ ╞╔╠╠
╠─┴ #01
╙╘┴ ╚╔─┼
╠─┴ #64
╙╘┴ ┌╧╧═
*-------------------------------
*└═AIN└LOOP
****└╟ET└KEYPRESS
═┴╔╬
├╠╔
╦╨╥┼╙╙ ╩╙╥ ╟┼╘╔╬
├═╨ #133 ;╞1?
┬╬┼ :╞2
╠─┴ ─╙╪
├═╨ #┴╬╟═┴╪/2 ;╬O└MORE└THAN└PI
┬┼╤ :├╧╬╘1
╔╬├ ─╙╪ ;OTHERWISE└INCREASE└X-ROTATION
╩═╨ :├╧╬╘
:╞2 ├═╨ #137 ;╞2?
┬╬┼ :╞3
╠─┴ ─╙╪
┬┼╤ :├╧╬╘1
─┼├ ─╙╪
╩═╨ :├╧╬╘
:╞3 ├═╨ #134
┬╬┼ :╞4
╠─┴ ─╙┘
├═╨ #┴╬╟═┴╪/2
┬┼╤ :├╧╬╘1
╔╬├ ─╙┘ ;╔NCREASE└Y-ROTATION
╩═╨ :├╧╬╘
:╞4 ├═╨ #138
┬╬┼ :╞5
╠─┴ ─╙┘
┬┼╤ :├╧╬╘1
─┼├ ─╙┘
╩═╨ :├╧╬╘
:╞5 ├═╨ #135
┬╬┼ :╞6
╠─┴ ─╙┌
├═╨ #┴╬╟═┴╪/2
┬┼╤ :├╧╬╘1
╔╬├ ─╙┌ ;Z-ROTATION
╩═╨ :├╧╬╘
:╞6 ├═╨ #139
┬╬┼ :╞7
╠─┴ ─╙┌
┬┼╤ :├╧╬╘1
─┼├ ─╙┌
╩═╨ :├╧╬╘
:╞7 ├═╨ #136
┬╬┼ :╨╠╒╙
╩═╨ ╔╬╔╘
:├╧╬╘1 ╩═╨ :├╧╬╘
:╨╠╒╙ ├═╨ #'+'
┬╬┼ :═╔╬╒╙
╔╬├ ┌╧╧═ ;┬AH,└WHO└NEEDS└ERROR└CHECKING?
╔╬├ ┌╧╧═
╩═╨ :├╧╬╘
:═╔╬╒╙ ├═╨ #'-'
┬╬┼ :╚
─┼├ ┌╧╧═
─┼├ ┌╧╧═
┬╨╠ :├╧╬╘
╔╬├ ┌╧╧═
╔╬├ ┌╧╧═
╩═╨ :├╧╬╘
:╚ ├═╨ #'H'
┬╬┼ :╙╨┴├┼
╠─┴ ╚╔─┼
┼╧╥ #$01
╙╘┴ ╚╔─┼
╩═╨ :├╧╬╘
:╙╨┴├┼ ├═╨ #'└'
┬╬┼ :╤
╠─┴ ╞╔╠╠
┼╧╥ #$01
╙╘┴ ╞╔╠╠
╩═╨ :├╧╬╘
:╤ ├═╨ #'Q' ;Q└QUITS
┬╬┼ :├╧╬╘
╩═╨ ├╠┼┴╬╒╨
:├╧╬╘ ╙┼╔ ;╙PEED└THINGS└UP└A└BIT
****└╒PDATE└ANGLES
╒╨─┴╘┼ ├╠├
╠─┴ ╙╪
┴─├ ─╙╪
├═╨ #┴╬╟═┴╪ ;┴RE└WE└>=└MAXIMUM└ANGLE?
┬├├ :├╧╬╘1
╙┬├ #┴╬╟═┴╪ :╔F SO, RESET
:├╧╬╘1 ╙╘┴ ╙╪
├╠├
╠─┴ ╙┘
┴─├ ─╙┘
├═╨ #┴╬╟═┴╪
┬├├ :├╧╬╘2
╙┬├ #┴╬╟═┴╪ ;╙AME└DEAL
:├╧╬╘2 ╙╘┴ ╙┘
├╠├
╠─┴ ╙┌
┴─├ ─╙┌
├═╨ #┴╬╟═┴╪
┬├├ :├╧╬╘3
╙┬├ #┴╬╟═┴╪
:├╧╬╘3 ╙╘┴ ╙┌
****└╥OTATE└COORDINATES
╥╧╘┴╘┼
***└╞IRST,└CALCULATE└T1,T2,...,T10
**└╘WO└MACROS└TO└SIMPLIFY└OUR└LIFE
┴──┴ ═┴├ ;┴DD└TWO└ANGLES└TOGETHER
├╠├
╠─┴ ]1
┴─├ ]2
├═╨ #┴╬╟═┴╪ ;╔S└THE└SUM└>└2*PI?
┬├├ ─╧╬┼
╙┬├ #┴╬╟═┴╪ ;╔F└SO,└SUBTRACT└2*PI
─╧╬┼ <<<
╙╒┬┴ ═┴├ ;╙UBTRACT└TWO└ANGLES
╙┼├
╠─┴ ]1
╙┬├ ]2
┬├╙ ─╧╬┼
┴─├ #┴╬╟═┴╪ ;╧OPS,└WE└NEED└TO└ADD└2*PI
─╧╬┼ <<<
**└╬OW└CALCULATE└T1,T2,ETC.
>>> ╙╒┬┴,╙┘;╙┌
╙╘┴ ╘1 ;T1=SY-SZ
>>> ┴──┴,╙┘;╙┌
╙╘┴ ╘2 ;T2=SY+SZ
>>> ┴──┴,╙╪;╙┌
╙╘┴ ╘3 ;T3=SX+SZ
>>> ╙╒┬┴,╙╪;╙┌
╙╘┴ ╘4 ;T4=SX-SZ
>>> ┴──┴,╙╪;╘2
╙╘┴ ╘5 ;T5=SX+T2
>>> ╙╒┬┴,╙╪;╘1
╙╘┴ ╘6 ;T6=SX-T1
>>> ┴──┴,╙╪;╘1
╙╘┴ ╘7 ;T7=SX+T1
>>> ╙╒┬┴,╘2;╙╪
╙╘┴ ╘8 ;T8=T2-SX
>>> ╙╒┬┴,╙┘;╙╪
╙╘┴ ╘9 ;T9=SY-SX
>>> ┴──┴,╙╪;╙┘
╙╘┴ ╘10 ;T10=SX+SY
*└┼T└VOILA!
***└╬EXT,└CALCULATE└┴,┬,├,...,╔
**└┴NOTHER└USEFUL└LITTLE└MACRO
─╔╓2 ═┴├ ;─IVIDE└A└SIGNED└NUMBER└BY└2
;╔T└IS└ASSUMED└THAT└THE└NUMBER
┬╨╠ ╨╧╙ ;IS└IN└THE└ACCUMULATOR
├╠├
┼╧╥ #$╞╞ ;╫E└NEED└TO└UN-NEGATIVE└THE└NUMBER
┴─├ #01 ;BY└TAKING└IT'S└COMPLEMENT
╠╙╥ ;DIVIDE└BY└TWO
├╠├
┼╧╥ #$╞╞
┴─├ #01 ;═AKE└IT└NEGATIVE└AGAIN
╩═╨ ─╧╬┼─╔╓
╨╧╙ ╠╙╥ ;╬UMBER└IS└POSITIVE
─╧╬┼─╔╓ <<<
═╒╠2 ═┴├ ;═ULTIPLY└A└SIGNED└NUMBER└BY└2
┬╨╠ ╨╧╙═
├╠├
┼╧╥ #$╞╞
┴─├ #$01
┴╙╠
├╠├
┼╧╥ #$╞╞
┴─├ #$01
╩═╨ ─╧╬┼═╒╠
╨╧╙═ ┴╙╠
─╧╬┼═╒╠ <<<